Seite 1 von 1

Pratt-Parser Mini-Framework

Verfasst: Freitag 22. August 2014, 16:02
von pillmuncher
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:

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)
lbp und rbp bedeuten Left/Right Binding Power. Beide leben noch in den Token-Objekten, sollten aber eigentlich in eine Lookup-Tabelle.