Pratt-Parser Mini-Framework
Verfasst: Freitag 22. August 2014, 16:02
Douglas Crockford hat freundlicherweise Pratt-Parser wieder ausgegraben. Hier ist meine Version (>= Python 3.2): http://www.python-forum.de/pastebin.php?mode=view&s=398
Bei meinem Anwendungsfall gibt es keine Operatoren, die sowohl unär wie binar sein können, deswegen wird dieser Fall auch nicht behandelt. Dafür kann man deklarativ angeben, welche Assoziativität jeder Operator haben soll.
Hier einige Teile der Ausgabe des verlinkten Codes:lbp und rbp bedeuten Left/Right Binding Power. Beide leben noch in den Token-Objekten, sollten aber eigentlich in eine Lookup-Tabelle.
Bei meinem Anwendungsfall gibt es keine Operatoren, die sowohl unär wie binar sein können, deswegen wird dieser Fall auch nicht behandelt. Dafür kann man deklarativ angeben, welche Assoziativität jeder Operator haben soll.
Hier einige Teile der Ausgabe des verlinkten Codes:
Code: Alles auswählen
a | b | c | d | e :
[Binary(value='|', lbp=20, rbp=21),
[[Binary(value='|', lbp=20, rbp=21),
[[Binary(value='|', lbp=20, rbp=21),
[[Binary(value='|', lbp=20, rbp=21),
[Nullary(value='a', lbp=0, rbp=0),
Nullary(value='b', lbp=0, rbp=0)]],
Nullary(value='c', lbp=0, rbp=0)]],
Nullary(value='d', lbp=0, rbp=0)]],
Nullary(value='e', lbp=0, rbp=0)]]
Code: Alles auswählen
a --> b & c | ~d :
[Binary(value='-->', lbp=10, rbp=10),
[Nullary(value='a', lbp=0, rbp=0),
[Binary(value='|', lbp=20, rbp=21),
[[Binary(value='&', lbp=30, rbp=29),
[Nullary(value='b', lbp=0, rbp=0), Nullary(value='c', lbp=0, rbp=0)]],
[Unary(value='~', lbp=0, rbp=40), [Nullary(value='d', lbp=0, rbp=0)]]]]]]
Code: Alles auswählen
a --> b & c | ~d --> e :
Error: Precedence conflict: (10) --> (10)