1# ----------------------------------------------------------------------------- 2# lex_optimize.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 15# Tokens 16 17t_PLUS = r'\+' 18t_MINUS = r'-' 19t_TIMES = r'\*' 20t_DIVIDE = r'/' 21t_EQUALS = r'=' 22t_LPAREN = r'\(' 23t_RPAREN = r'\)' 24t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*' 25 26def t_NUMBER(t): 27 r'\d+' 28 try: 29 t.value = int(t.value) 30 except ValueError: 31 print("Integer value too large %s" % t.value) 32 t.value = 0 33 return t 34 35t_ignore = " \t" 36 37def t_newline(t): 38 r'\n+' 39 t.lineno += t.value.count("\n") 40 41def t_error(t): 42 print("Illegal character '%s'" % t.value[0]) 43 t.lexer.skip(1) 44 45# Build the lexer 46lex.lex(optimize=1) 47lex.runmain(data="3+4") 48 49 50 51