Hi BlackJack,
erst nochmals Danke fuer deine Bemuehungen; du scheinst meine letzte Hoffnung zu sein
BlackJack hat geschrieben:Und die ganzen ``zeroOrMore('{')`` und auch die entsprechenden schliessenden Klammern machen die Grammatik ziemlich "komisch" und wohl auch uneindeutig. Die Klammern sind schliesslich da um einen Block oder eine Verschachtelungsebene zu identifizieren.
Dies war ein unschoener Versuch, mehrere sich oeffnende und schliessende Klammern parsen zu koennen (sieht man gleich im Beispiel).
BlackJack hat geschrieben:
Versuch mal, ob das klappt. Eine Liste im Ergebnis erkennt man daran, das sie keine Zeichenkette ist und keine Schlüssel besitzt, also `len(x.keys()) == 0` gilt, wenn `x` das entsprechende `ParserResult` Objekt ist.
Also logisch ist die neue Funktion, aber der Interpreter meckert bei der ersten verschachtelten Zuweisung:
pyparsing.ParseException: Expected "}" (at char 205), (line:14, col:5): Dies ist am Ender der Anweisung b1:={...},
Die Grammatik ist nicht besonders schön, weil man mehr als ein Token vorausschauen muss um entscheiden zu können, ob man eine Liste oder ein weiteres "Dictionary" nach einem '{' hat.
Da muss ich dir recht geben, leider ist sie so festgeschrieben.
Wo kommen die Daten denn her? Gibt's vielleicht eine offizielle Grammatik dafür?
Die Daten sind in Dateien enthalten. Sie belegen Datenstrukturen mit speziellen Werten. Es kann aber davon ausgegangen werden, dass die Dateien syntaktisch korrekt sind, d.h. es waere auch egal, wenn eine falsche Klammerung in der Datei nicht vom Parser angemeckert wird, solange das erzeugte Dictionary bzw. Liste korrekt ist.
Nein, leider gibt es keine offizielle Grammatik. Ich gebe aber mal ein vollstaendiges Beispiel an, welches alle Sonderfaelle enthaelt.
Meine im letzten Post angegebene Funktion macht doch alles richtig, auch wenn sie nicht sauber programmiert ist, bis natuerlich auf die Parameterliste, aber die ist kommt spaeter.
Ich hatte wohl gestern nach ein paar Stunden Konzentration auf die Funktion nen Knick in der Optik.
Da aber die Templates spaeter auch wieder ausgegeben werden muessen, habe ich das Problem, dass ich wissen muss wieviele Klammer an jede Stelle gesetzt werden muessen, d.h. aus
wird ['a', ['c0', ['b', '5']]], woraus ich nicht mehr auf die Anzahl der Klammern schliessen kann. Also waere eine Moeglichkeit die Lieste folgendermassen aussehen zu lassen:
['a', ['c0', ['{', '{', 'b', '5', '}', '}']]] oder? Ich sehe da im Moment keine einfacher Moeglichkeit.
Code: Alles auswählen
template Typ1 name1 (Parameterliste z.B. template Typ2 name 2, template ... ) :=
{
//Fall 1: Normale Zuweisung
c1 := d1,
//Fall 2: Normale verschachtelte Zuweisung
b1 :=
{
b2 :=
{
a3 := 2,
b3 := 3
},
a2 := 4
},
//Fall 3: Leere Liste
a3 :=
{
},
//Fall 4: Liste mit einem Element
a4 :=
{
10
},
//Fall 5: Liste mit mehreren Elementen
a5 :=
{
7,
8,
9
},
//Sonderfall 1: Zuweisung(en) in geschweiften Klammern
a6:=
{
a7:=
{
{
a8 := 7,
a9 := 8
},
{
a10 := 99
}
}
},
//Sonderfall 2: mehrere Klammern
a11:=
{
{
{
a12 := 42,
a13 :=
{
a14 := 17
}
}
}
}
}
Mann, mann mann. Ich dir auf jedenfall ein paar Bier schuldig, da du mir jetzt schon ein gutes Stueck weitergeholfen hast. Ich teste mal weiter und schreibe, wenn ich eine Loesung gefunden habe.
Gruss
Gerd