12632Sstever@eecs.umich.edu# ----------------------------------------------------------------------------- 22632Sstever@eecs.umich.edu# calclex.py 32632Sstever@eecs.umich.edu# ----------------------------------------------------------------------------- 44479Sbinkertn@umich.eduimport sys 54479Sbinkertn@umich.edu 66498Snate@binkert.orgif ".." not in sys.path: sys.path.insert(0,"..") 74479Sbinkertn@umich.eduimport ply.lex as lex 82632Sstever@eecs.umich.edu 92632Sstever@eecs.umich.edutokens = ( 102632Sstever@eecs.umich.edu 'NAME','NUMBER', 112632Sstever@eecs.umich.edu 'PLUS','MINUS','TIMES','DIVIDE','EQUALS', 122632Sstever@eecs.umich.edu 'LPAREN','RPAREN', 132632Sstever@eecs.umich.edu ) 142632Sstever@eecs.umich.edu 152632Sstever@eecs.umich.edu# Tokens 162632Sstever@eecs.umich.edu 172632Sstever@eecs.umich.edut_PLUS = r'\+' 182632Sstever@eecs.umich.edut_MINUS = r'-' 192632Sstever@eecs.umich.edut_TIMES = r'\*' 202632Sstever@eecs.umich.edut_DIVIDE = r'/' 212632Sstever@eecs.umich.edut_EQUALS = r'=' 222632Sstever@eecs.umich.edut_LPAREN = r'\(' 232632Sstever@eecs.umich.edut_RPAREN = r'\)' 242632Sstever@eecs.umich.edut_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*' 252632Sstever@eecs.umich.edu 262632Sstever@eecs.umich.edudef t_NUMBER(t): 272632Sstever@eecs.umich.edu r'\d+' 282632Sstever@eecs.umich.edu try: 292632Sstever@eecs.umich.edu t.value = int(t.value) 302632Sstever@eecs.umich.edu except ValueError: 316498Snate@binkert.org print("Integer value too large %s" % t.value) 322632Sstever@eecs.umich.edu t.value = 0 332632Sstever@eecs.umich.edu return t 342632Sstever@eecs.umich.edu 352632Sstever@eecs.umich.edut_ignore = " \t" 362632Sstever@eecs.umich.edu 372632Sstever@eecs.umich.edudef t_newline(t): 382632Sstever@eecs.umich.edu r'\n+' 392632Sstever@eecs.umich.edu t.lineno += t.value.count("\n") 406498Snate@binkert.org 412632Sstever@eecs.umich.edudef t_error(t): 426498Snate@binkert.org print("Illegal character '%s'" % t.value[0]) 434479Sbinkertn@umich.edu t.lexer.skip(1) 446498Snate@binkert.org 452632Sstever@eecs.umich.edu# Build the lexer 462632Sstever@eecs.umich.edulex.lex() 472632Sstever@eecs.umich.edu 482632Sstever@eecs.umich.edu 492632Sstever@eecs.umich.edu 50