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)