16498Snate@binkert.org# ----------------------------------------------------------------------------- 26498Snate@binkert.org# lex_closure.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.orgdef make_calc(): 166498Snate@binkert.org 176498Snate@binkert.org # Tokens 186498Snate@binkert.org 196498Snate@binkert.org t_PLUS = r'\+' 206498Snate@binkert.org t_MINUS = r'-' 216498Snate@binkert.org t_TIMES = r'\*' 226498Snate@binkert.org t_DIVIDE = r'/' 236498Snate@binkert.org t_EQUALS = r'=' 246498Snate@binkert.org t_LPAREN = r'\(' 256498Snate@binkert.org t_RPAREN = r'\)' 266498Snate@binkert.org t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*' 276498Snate@binkert.org 286498Snate@binkert.org def t_NUMBER(t): 296498Snate@binkert.org r'\d+' 306498Snate@binkert.org try: 316498Snate@binkert.org t.value = int(t.value) 326498Snate@binkert.org except ValueError: 336498Snate@binkert.org print("Integer value too large %s" % t.value) 346498Snate@binkert.org t.value = 0 356498Snate@binkert.org return t 366498Snate@binkert.org 376498Snate@binkert.org t_ignore = " \t" 386498Snate@binkert.org 396498Snate@binkert.org def t_newline(t): 406498Snate@binkert.org r'\n+' 416498Snate@binkert.org t.lineno += t.value.count("\n") 426498Snate@binkert.org 436498Snate@binkert.org def t_error(t): 446498Snate@binkert.org print("Illegal character '%s'" % t.value[0]) 456498Snate@binkert.org t.lexer.skip(1) 466498Snate@binkert.org 476498Snate@binkert.org # Build the lexer 486498Snate@binkert.org return lex.lex() 496498Snate@binkert.org 506498Snate@binkert.orgmake_calc() 516498Snate@binkert.orglex.runmain(data="3+4") 526498Snate@binkert.org 536498Snate@binkert.org 546498Snate@binkert.org 55