Existe uma boa, re-utilizáveis ??analisador que converte uma string em uma hierarquia de listas?

StackOverflow https://stackoverflow.com/questions/456259

Pergunta

Eu gostaria de ter uma seqüência como esta:

[One, Two[A, B[i, ii, iii, iv], C], Three]

E convertê-lo em uma hierarquia de listas, de modo que se eu executar o código como o seguinte:

Console.Write(myList[1][1][2]);

A saída será:

iii

Eu estou esperando que este é um requisito bastante comum que há algum código de análise simples escrito em C # isso.

Deixe-me saber se a minha pergunta poderia ser formulada de forma mais clara.

Foi útil?

Solução

JSON são excelentes métodos para armazenar coisas como esta.

Como Spence disse - este é um problema difícil -. Eu não recomendo rolar seus próprios

Vá até a parte inferior do que apontam JSON para implementações na maioria dos idiomas.

Outras dicas

Eu teria que ir com uma expressão regular. Substring partidas sub-expressões podem dar-lhe a recursão para obter o sub-sub -... níveis em.

Use algo como /^\[(.+)\]$/ em preg para coletar um único nível de itens. Processá-lo até que você não receber um nível mais, explodir em '' depois que você começa a coragem de uma única série.

resultado dividida por um ''.

deve sair como

  • [um, dois [A, B [i, ii, iii, iv], C], Três]
    • Uma
    • Dois
    • [A, B [i, ii, iii, iv], C]
      • A
      • B
      • [i, ii, iii, iv]
        • i
        • ii
        • iii
        • iv
      • C
    • Três

Finalmente aparar os espaços / direita e esquerda para obter o resultado polido.

Você após matrizes ou listas?

Isso seria extremamente difícil de fazer com cordas como você tem que lidar com espaços, ou o uso de uma vírgula em um elemento etc.

Se você tem controle sobre o que está nesta lista, sugiro que você olhar para XML ou serialização binária, que têm bibliotecas para ajudá-lo a fazer isso.

Não é uma resposta prática, mas se você é capaz de usar o beta .NET 4.0, você pode olhar para Oslo (e ferramental posterior) que a Microsoft está desenvolvendo para textual DSL do que parece é exatamente o que você precisa.

Meu voto é também para XML ou JSON ou outro formato se você tiver a capacidade de controlar o formato. Mas sem que, aqui está uma implementação Python do analisador porque eu estava entediado.

class ExprParser(object):
current = []
list_stack = []

def __init__(self):
    pass

def parse(self,input):
    for atom in [s.strip() for s in input.split(',')]:
        self.parse_atom(atom)
    return self.current

def do_pushes(self,atom):
    """ Strip off the '[' and push new lists """
    i = 0
    while i < len(atom) and atom[i] == '[':
        self.push()
        i += 1
    return atom[i:]

def do_pops(self,atom):
    """ Pop the lists """
    i = 0
    while i < len(atom) and atom[i] == ']':
        self.pop()
        i += 1

def parse_atom(self,atom):
    push_start = atom.find('[')

    rest = self.do_pushes(atom[push_start:]) if push_start >= 0 else atom

    pop_start = rest.find(']')

    val = rest[:pop_start] if pop_start >= 0 else rest

    self.add(val)

    if pop_start >= 0:
        self.do_pops(rest[pop_start:])

def push(self):
    self.current = []
    self.list_stack.append(self.current)

def pop(self):
    done = self.list_stack.pop()
    self.current = self.list_stack[-1] if self.list_stack else done
    if self.current is not done:
        self.add(done)

def add(self,val):
    self.current.append(val)

Use como:

parser = ExprParser()
parser.parse('[One, Two[A, B[i, ii, iii, iv], C], Three]')

No tratamento de erro embora para entrada malformado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top