Ich baue einen Parser für das IBM Rhapsody sbs
Dateiformat. Aber leider funktioniert der Rekursionsteil nicht wie erwartet. Die Regel pp.Word(pp.printables + " ")
ist wahrscheinlich das Problem, da es auch ;
und {}
übereinstimmt. Aber mindestens ;
kann auch Teil der Werte sein.pyparsing Rekursion der Werteliste (ibm Rhapsody)
import pyparsing as pp
import pprint
TEST = r"""{ foo
- key = bla;
- value = 1243; 1233; 1235;
- _hans = "hammer
time";
- HaMer = 765; 786; 890;
- value = "
#pragma LINK_INFO DERIVATIVE \"mc9s12xs256\"
";
- _mText = 12.11.2015::13:20:0;
- value = "war"; "fist";
- _obacht = "fish,car,button";
- _id = gibml c0d8-4535-898f-968362779e07;
- bam = { boing
- key = bla;
}
{ boing
- key = bla;
}
}
"""
def flat(loc, toks):
if len(toks[0]) == 1:
return toks[0][0]
assignment = pp.Suppress("-") + pp.Word(pp.alphanums + "_") + pp.Suppress("=")
value = pp.OneOrMore(
pp.Group(assignment + (
pp.Group(pp.OneOrMore(
pp.QuotedString('"', escChar="\\", multiline=True) +
pp.Suppress(";"))).setParseAction(flat) |
pp.Word(pp.alphas) + pp.Suppress(";") |
pp.Word(pp.printables + " ")
))
)
expr = pp.Forward()
expr = pp.Suppress("{") + pp.Word(pp.alphas) + (
value | (assignment + expr) | expr
) + pp.Suppress("}")
expr = expr.ignore(pp.pythonStyleComment)
print TEST
pprint.pprint(expr.parseString(TEST).asList())
Ausgang:
% python prase.py
{ foo
- key = bla;
- value = 1243; 1233; 1235;
- _hans = "hammer
time";
- HaMer = 765; 786; 890;
- value = "
#pragma LINK_INFO DERIVATIVE \"mc9s12xs256\"
";
- _mText = 12.11.2015::13:20:0;
- value = "war"; "fist";
- _obacht = "fish,car,button";
- _id = gibml c0d8-4535-898f-968362779e07;
- bam = { boing
- key = bla;
}
{ boing
- key = bla;
}
}
['foo',
['key', 'bla'],
['value', '1243; 1233; 1235;'],
['_hans', 'hammer\n time'],
['HaMer', '765; 786; 890;'],
['value', '\n #pragma LINK_INFO DERIVATIVE "mc9s12xs256"\n '],
['_mText', '12.11.2015::13:20:0;'],
['value', ['war', 'fist']],
['_obacht', 'fish,car,button'],
['_id', 'gibml c0d8-4535-898f-968362779e07;'],
['bam', '{ boing'],
['key', 'bla']]
Gibt es einen Tippfehler in TEST? Sollte die letzte Gruppe nach '- bam {boing usw.}' '' 'etwas = {boing \ n- key = bla; } '? Es ist schwer zu sehen, was dieses Format sein soll, du hast hier und da verschiedene OneOrMore. Ich denke, wenn Sie aufhörten und zuerst ein BNF schrieben, würden die Dinge klarer sein. – PaulMcG
Auch ich rate dringend von Ausdrücken, die zu viel passen, wie 'pp.Word (printables + '')' - lesen Sie auf die neueste Version von Pyparssing Word-Klasse, die das 'excludeChars' Argument enthält, so dass, wenn Sie wirklich brauchen etwas wie "Wort (alles außer ';' ')", dann schreibe' Word (Ausdrucke, excludeChars = ';') '. – PaulMcG
Leider ist das Format richtig. Ein echtes Beispiel https://github.com/mansam/exploring-rhapsody/blob/master/LightSwitch/LightSwitch.rpy – delijati