¿Existe un buen analizador reutilizable que convierta una cadena en una jerarquía de listas?

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

Pregunta

Me gustaría tomar una cadena como esta:

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

Y conviértalo en una jerarquía de listas, de modo que si ejecuto código como el siguiente:

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

El resultado será:

iii

Espero que este sea un requisito lo suficientemente común como para que haya un código de análisis simple escrito en C # this.

Avíseme si mi pregunta podría formularse más claramente.

¿Fue útil?

Solución

XML o JSON son métodos excelentes para almacenar cosas como esta.

Como dijo Spence, este es un problema difícil, no recomiendo rodar el suyo.

Desplácese hasta la parte inferior de ese enlace JSON para implementaciones en la mayoría de los idiomas.

Otros consejos

Tendría que ir con una expresión regular. Las coincidencias de subcadenas y las subexpresiones pueden darle la recursividad para obtener los niveles de sub-sub-...

Use algo como /^\[(.+)\font>$/ in preg para recoger un solo nivel de elementos. Proceselo hasta que ya no reciba un nivel, explote en ',' después de obtener las agallas de una sola serie.

Divide el resultado entre un ','.

debería salir como

  • [Uno, Dos [A, B [i, ii, iii, iv], C], Tres]
    • Uno
    • Dos
    • [A, B [i, ii, iii, iv], C]
      • A
      • B
      • [i, ii, iii, iv]
        • i
        • ii
        • iii
        • iv
      • C
    • Tres

Finalmente recorte los espacios izquierdo / derecho para obtener su resultado pulido.

¿Buscas matrices o listas?

Esto sería extremadamente difícil de hacer con cadenas ya que tienes que lidiar con espacios, o el uso de una coma en un elemento, etc.

Si tiene control sobre lo que está en esta lista, le sugiero que busque en la serialización XML o binaria, que tienen bibliotecas para ayudarlo a hacer esto.

No es una respuesta práctica, pero si puede usar la versión beta de .NET 4.0, podría investigar Oslo (y las herramientas posteriores) que Microsoft está desarrollando para DSL textuales, que parece ser exactamente lo que necesita.

Mi voto también es para XML o JSON u otro formato si tiene la capacidad de controlar el formato. Pero a falta de eso, aquí hay una implementación de Python del analizador porque estaba aburrido.

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)

Usar como:

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

Sin embargo, no se manejan errores para entradas mal formadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top