[ create a new paste ] login | about

Link: http://codepad.org/L1YMShLv    [ raw code | fork ]

aaronla - Python, pasted on Feb 14:
from parse import *
from test1 import timeit

def group(p):
  return p % (lambda v: ('group', v))
mark = empty % (lambda _: '<eval')
def ignore (p):
  return p % (lambda _: None)
g = rgrammar(lambda id: {
  'E': id('A') + repeat( id('opA') + id('A') + mark),
  'A': id('T') + repeat( id('opT') + id('T') + mark),
  'T': pred(str.isdigit)
     | pred(str.isalpha)
     | ignore(literal('(')) + id('E') + ignore(literal(')')),
  'opT': literal('*', '/', '%'),
  'opA': literal('+', '-'),
})
print g['E'].match_s('1')
# ==> prints (1, ['1'])
print g['E'].match_s('1+2*3')
# ==> prints (1, ['1', '+', '2', '*', '3', '<eval', '<eval'])

print g['E'].match_s('(1+2)*3')
# ==> prints (1, ['1', '+', '2', '<eval', '*', '3', '<eval'])

print g['E'].match_s('(1+2)*(3+)*4')
# ==> prints (0, ['error line %(line)d (ix=%(ix)d) near %(sample)r', 
#                 {'sample': ')*4', 'ix':9, 'line': 1}])

timeit(lambda: g['E'].match_s('(((1+2+3+5))+((4*5)*6*(7)))'))
# ==> prints time = 0.008378 sec


Create a new paste based on this one


Comments: