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