Tutorial 4 Ambiguity and Left Recursion
まんま
>>> from lepl import * >>> symbol = Token('[^0-9a-zA-Z \t\r\n]') >>> value = Token(UnsignedFloat()) >>> negfloat = lambda x: -float(x) >>> number = Or(value >> float, ... ~symbol('-') & value >> negfloat) >>> group2, group3 = Delayed(), Delayed() >>> parens = symbol('(') & group3 & symbol(')') >>> group1 = parens | number >>> mul = group1 & symbol('*') & group2 > Node >>> div = group1 & symbol('/') & group2 > Node >>> group2 += group1 | mul | div >>> add = group2 & symbol('+') & group3 > Node >>> sub = group2 & symbol('-') & group3 > Node >>> group3 += group2 | add | sub >>> ast = group3.parse('1+2*(3-4)+5/6+7')[0] >>> print(ast) 1.0 >>> len(list(group3.match('1+2*(3-4)+5/6+7'))) 6 >>> expr = group3 & Eos() >>> print(expr.parse('1+2*(3-4)+5/6+7')[0]) Node +- 1.0 +- '+' `- Node +- Node | +- 2.0 | +- '*' | +- '(' | +- Node | | +- 3.0 | | +- '-' | | `- 4.0 | `- ')' +- '+' `- Node +- Node | +- 5.0 | +- '/' | `- 6.0 +- '+' `- 7.0 >>> len(list(expr.match('1+2*(3-4)+5/6+7'))) 1
>>> from lepl import * >>> symbol = Token('[^0-9a-zA-Z \t\r\n]') >>> value = Token(UnsignedFloat()) >>> negfloat = lambda x: -float(x) >>> number = Or(value >> float, ... ~symbol('-') & value >> negfloat) >>> group2, group3 = Delayed(), Delayed() >>> parens = symbol('(') & group3 & symbol(')') >>> group1 = parens | number >>> mul = group2 & symbol('*') & group2 > Node >>> div = group2 & symbol('/') & group2 > Node >>> group2 += mul | div | group1 >>> add = group3 & symbol('+') & group3 > Node >>> sub = group3 & symbol('-') & group3 > Node >>> group3 += add | sub | group2 >>> ast = group3.parse('1+2*(3-4)+5/6+7')[0] >>> print(ast) 1.0 >>> len(list(group3.match('1+2*(3-4)+5/6+7'))) No handlers could be found for logger "lepl.memo.PerCallCache" 12 >>> expr = group3 & Eos() >>> len(list(expr.match('1+2*(3-4)+5/6+7'))) 5 >>> ast = expr.parse('1+2*(3-4)+5/6+7')[0] No handlers could be found for logger "lepl.memo.PerCallCache" >>> print(ast) Node +- 1.0 +- '+' `- Node +- Node | +- 2.0 | +- '*' | +- '(' | +- Node | | +- 3.0 | | +- '-' | | `- 4.0 | `- ')' +- '+' `- Node +- Node | +- 5.0 | +- '/' | `- 6.0 +- '+' `- 7.0