Pratt-Parser Mini-Framework

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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.
In specifications, Murphy's Law supersedes Ohm's.
Antworten