1# ----------------------------------------------------------------------------- 2# lex_closure.py 3# ----------------------------------------------------------------------------- 4import sys 5 6if ".." not in sys.path: sys.path.insert(0,"..") 7import ply.lex as lex 8 9tokens = ( 10 'NAME','NUMBER', 11 'PLUS','MINUS','TIMES','DIVIDE','EQUALS', 12 'LPAREN','RPAREN', 13 ) 14 15def make_calc(): 16 17 # Tokens 18 19 t_PLUS = r'\+' 20 t_MINUS = r'-' 21 t_TIMES = r'\*' 22 t_DIVIDE = r'/' 23 t_EQUALS = r'=' 24 t_LPAREN = r'\(' 25 t_RPAREN = r'\)' 26 t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*' 27 28 def t_NUMBER(t): 29 r'\d+' 30 try: 31 t.value = int(t.value) 32 except ValueError: 33 print("Integer value too large %s" % t.value) 34 t.value = 0 35 return t 36 37 t_ignore = " \t" 38 39 def t_newline(t): 40 r'\n+' 41 t.lineno += t.value.count("\n") 42 43 def t_error(t): 44 print("Illegal character '%s'" % t.value[0]) 45 t.lexer.skip(1) 46 47 # Build the lexer 48 return lex.lex() 49 50make_calc() 51lex.runmain(data="3+4") 52 53 54 55