16498Snate@binkert.org# ----------------------------------------------------------------------------- 26498Snate@binkert.org# lex_optimize2.py 36498Snate@binkert.org# ----------------------------------------------------------------------------- 46498Snate@binkert.orgimport sys 56498Snate@binkert.org 66498Snate@binkert.orgif ".." not in sys.path: sys.path.insert(0,"..") 76498Snate@binkert.orgimport ply.lex as lex 86498Snate@binkert.org 96498Snate@binkert.orgtokens = ( 106498Snate@binkert.org 'NAME','NUMBER', 116498Snate@binkert.org 'PLUS','MINUS','TIMES','DIVIDE','EQUALS', 126498Snate@binkert.org 'LPAREN','RPAREN', 136498Snate@binkert.org ) 146498Snate@binkert.org 156498Snate@binkert.org# Tokens 166498Snate@binkert.org 176498Snate@binkert.orgt_PLUS = r'\+' 186498Snate@binkert.orgt_MINUS = r'-' 196498Snate@binkert.orgt_TIMES = r'\*' 206498Snate@binkert.orgt_DIVIDE = r'/' 216498Snate@binkert.orgt_EQUALS = r'=' 226498Snate@binkert.orgt_LPAREN = r'\(' 236498Snate@binkert.orgt_RPAREN = r'\)' 246498Snate@binkert.orgt_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*' 256498Snate@binkert.org 266498Snate@binkert.orgdef t_NUMBER(t): 276498Snate@binkert.org r'\d+' 286498Snate@binkert.org try: 296498Snate@binkert.org t.value = int(t.value) 306498Snate@binkert.org except ValueError: 316498Snate@binkert.org print("Integer value too large %s" % t.value) 326498Snate@binkert.org t.value = 0 336498Snate@binkert.org return t 346498Snate@binkert.org 356498Snate@binkert.orgt_ignore = " \t" 366498Snate@binkert.org 376498Snate@binkert.orgdef t_newline(t): 386498Snate@binkert.org r'\n+' 396498Snate@binkert.org t.lineno += t.value.count("\n") 406498Snate@binkert.org 416498Snate@binkert.orgdef t_error(t): 426498Snate@binkert.org print("Illegal character '%s'" % t.value[0]) 436498Snate@binkert.org t.lexer.skip(1) 446498Snate@binkert.org 456498Snate@binkert.org# Build the lexer 466498Snate@binkert.orglex.lex(optimize=1,lextab="opt2tab") 476498Snate@binkert.orglex.runmain(data="3+4") 486498Snate@binkert.org 496498Snate@binkert.org 506498Snate@binkert.org 51