Gibt es einen guten, wiederverwendbaren Parser, der eine Zeichenfolge in eine Hierarchie von Listen konvertiert?

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

Frage

Ich möchte eine Zeichenfolge wie diese zu übernehmen:

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

Und es in eine Hierarchie von Listen konvertieren, so dass, wenn ich Code ausführen wie folgt:

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

Der Ausgang wird sein:

iii

Ich hoffe, dass dies eine gemeinsame genug Voraussetzung ist, dass es einige einfache Parsing-Code in C # geschrieben dies.

Lassen Sie mich wissen, wenn meine Frage deutlicher formuliert werden.

War es hilfreich?

Lösung

XML oder JSON sind ausgezeichnete Methoden, Dinge wie diese zu speichern.

Wie Spence sagte - das ist ein schwieriges Problem - ich weiß nicht empfehlen, einen eigenen Roll

.

Blättern Sie zum Ende des JSON Link unten für Implementierungen in den meisten Sprachen.

Andere Tipps

Ich muß mit einem regulären Ausdruck gehen würde. Substring Spiele und Unterausdrücke können Sie die Rekursion geben in den Sub-Sub -... Ebenen.

so etwas wie /^\[(.+)\]$/ in Preg Verwenden Sie eine einzelne Ebene der Gegenstände zu sammeln. Verarbeiten Sie es, bis Sie keine Ebene mehr erhalten, explodieren auf ‚‘ nachdem Sie den Mut einer einzigen Serie zu bekommen.

Split Ergebnis von a ''.

kommen sollte wie

  • [One, Two [A, B [i, ii, iii, iv], C], Drei]
    • Ein
    • Zwei
    • [A, B [i, ii, iii, iv] C]
      • A
      • B
      • [i, ii, iii, iv]
        • i
        • ii
        • iii
        • iv
      • C
    • Drei

abschneiden schließlich mit der linken / rechten Räume Ihr poliert Ergebnis zu erhalten.

Sind Sie nach Arrays oder Listen?

Dies wäre äußerst schwierig, mit Streichern zu tun, wie Sie mit Leerzeichen zu tun haben, oder die Verwendung eines Kommas in einem Element etc.

Wenn Sie die Kontrolle haben, was in dieser Liste enthalten ist, schlage ich vor, dass Sie XML aussehen in oder binäre Serialisierung, die Bibliotheken zu helfen, haben Sie dies tun.

Es ist nicht eine praktische Antwort, aber wenn Sie in der Lage sind, den .NET 4.0 Beta zu verwenden, könnte man in Oslo sucht (und nachfolgende Tooling), die Microsoft für textuellen DSLs entwickelt, die es scheint, ist genau das, was Sie brauchen.

Meine Stimme ist auch für XML oder JSON oder ein anderes Format, wenn Sie die Fähigkeit zu kontrollieren, um das Format haben. Aber fehlt, dass hier eine Python-Implementierung des Parsers, weil ich langweilig war.

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)

Verwenden Sie wie:

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

Kein Fehler jedoch für fehlerhafte Eingabe der Handhabung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top