Tutorial 4 Efficiency

まんま

>>> 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]
>>> expr = group3 & Eos()
>>> parser = group3.string_parser()
>>> import timeit
>>> timeit.timeit('parser("1+2*(3-4)+5/6+7")', 'from __main__ import parser', number=100)
0.1697530746459961
>>> parser = expr.string_parser()
>>> timeit.timeit('parser("1+2*(3-4)+5/6+7")', 'from __main__ import parser', number=100)
No handlers could be found for logger "lepl.memo.PerCallCache"
5.1608359813690186
>>> parser = expr.string_parser()
>>> timeit.timeit('parser("1+2*(3-4)+5/6+7")', 'from __main__ import parser', number=100)
4.509387016296387