opar = Tok(r'\(') cpar = Tok(r'\)') equal = Tok(r'\=') rr = Tok(r'\>\>') exprs = Parser() expr = Parser() prim = Parser() expo = Parser() sign = Parser() fact = Parser() summ = Parser() asgn = Parser() prin = Parser() prim.parser = num | var | opar + expr - cpar expo.parser = ((prim - dstar & expo < (lambda a, b: a**b)) | prim) sign.parser = ((plus + sign < (lambda x: +x)) | (dash + sign < (lambda x: -x)) | expo) fact.parser = sign << ((star + sign, (lambda a, b: a * b)), (slash + sign, (lambda a, b: a / b)), (mod + sign, (lambda a, b: a % b))) summ.parser = fact << ((plus + fact, (lambda a, b: a + b)), (dash + fact, (lambda a, b: a - b))) asgn.parser = ((nam - equal & asgn < (lambda n, v: (env.__setitem__(n, v), v)[-1])) | summ) prin.parser = ((rr + expr < (lambda x: (print(x), x)[-1])) | asgn) expr.parser = prin
opar = Tok(r'\(') cpar = Tok(r'\)') equal = Tok(r'\=') rr = Tok(r'\>\>') exprs = Parser() expr = Parser() prim = Parser() expo = Parser() sign = Parser() fact = Parser() summ = Parser() asgn = Parser() prin = Parser() prim.parser = num | var | opar + expr - cpar expo.parser = ( (prim - dstar & expo < (lambda a, b: a ** b)) | prim ) sign.parser = ( (plus + sign < (lambda x : +x)) | (dash + sign < (lambda x : -x)) | expo ) fact.parser = sign << ( (star + sign, (lambda a, b : a * b)), (slash + sign, (lambda a, b : a / b)), (mod + sign, (lambda a, b : a % b)) ) summ.parser = fact << (
cpar = Tok(r'\)') equal = Tok(r'\=') kw_print = Tok(r'print') exprs = Parser() exprl = Parser() expr = Parser() prim = Parser() expo = Parser() sign = Parser() fact = Parser() summ = Parser() asgn = Parser() prin = Parser() prim.parser = flt | int_ | var | opar + expr - cpar expo.parser = ((prim - dstar & expo < Pow) | prim) sign.parser = ((plus + sign < Pos) | (dash + sign < Neg) | expo) fact.parser = sign << ((star + sign, Mul), (slash + sign, Div), (mod + sign, Mod)) summ.parser = fact << ((plus + fact, Add), (dash + fact, Sub)) asgn.parser = ((nam - equal & asgn < Asgn) | summ) prin.parser = ((kw_print + expr < Prin) | asgn) expr.parser = prin exprl.parser = ((expr & exprl < (lambda a, b: (a, b))) | (end < (lambda x: None))) exprs.parser = exprl < Exprs
cpar = Tok(r'\)') equal = Tok(r'\=') kw_print = Tok(r'print') exprs = Parser() exprl = Parser() expr = Parser() prim = Parser() expo = Parser() sign = Parser() fact = Parser() summ = Parser() asgn = Parser() prin = Parser() prim.parser = flt | int_ | var | opar + expr - cpar expo.parser = ( (prim - dstar & expo < Pow) | prim ) sign.parser = ( (plus + sign < Pos) | (dash + sign < Neg) | expo ) fact.parser = sign << ( (star + sign, Mul), (slash + sign, Div), (mod + sign, Mod) ) summ.parser = fact << (