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