Tutorial 4 Evaluation

まんま

>>> from lepl import *
>>> from operator import add, sub, mul, truediv
>>> class Op(Node):
...     def __float__(self):
...         return self._op(float(self[0]), float(self[1]))
...
>>> class Add(Op): _op = add
...
>>> class Sub(Op): _op = sub
...
>>> class Mul(Op): _op = mul
...
>>> class Div(Op): _op = truediv
...
>>> symbol = Token('[^0-9a-zA-Z \t\r\n]')
>>> value = Token(UnsignedFloat())
>>> negfloat = lambda x: -float(x)
>>> group2, group3 = Delayed(), Delayed()
>>> number = Or(value >> float, ~symbol('-') & value >> negfloat)
>>> parens = ~symbol('(') & group3 & ~symbol(')')
>>> group1 = parens | number
>>> ml = group1 & ~symbol('*') & group2 > Mul
>>> dv = group1 & ~symbol('/') & group2 > Div
>>> group2 += ml | dv | group1
>>> ad = group2 & ~symbol('+') & group3 > Add
>>> sb = group2 & ~symbol('-') & group3 > Sub
>>> group3 += ad | sb | group2
>>> ast = group3.parse('1+2*(3-4)+5/6+7')[0]
>>> print(ast)
Add
 +- 1.0
 `- Add
     +- Mul
     |   +- 2.0
     |   `- Sub
     |       +- 3.0
     |       `- 4.0
     `- Add
         +- Div
         |   +- 5.0
         |   `- 6.0
         `- 7.0
>>> float(ast)
6.833333333333333
>>> 1+2*(3-4)+5/6+7
6.833333333333333