16498Snate@binkert.org# ----------------------------------------------------------------------------- 26498Snate@binkert.org# lex_object.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.orgclass CalcLexer: 106498Snate@binkert.org tokens = ( 116498Snate@binkert.org 'NAME','NUMBER', 126498Snate@binkert.org 'PLUS','MINUS','TIMES','DIVIDE','EQUALS', 136498Snate@binkert.org 'LPAREN','RPAREN', 146498Snate@binkert.org ) 156498Snate@binkert.org 166498Snate@binkert.org # Tokens 176498Snate@binkert.org 186498Snate@binkert.org t_PLUS = r'\+' 196498Snate@binkert.org t_MINUS = r'-' 206498Snate@binkert.org t_TIMES = r'\*' 216498Snate@binkert.org t_DIVIDE = r'/' 226498Snate@binkert.org t_EQUALS = r'=' 236498Snate@binkert.org t_LPAREN = r'\(' 246498Snate@binkert.org t_RPAREN = r'\)' 256498Snate@binkert.org t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*' 266498Snate@binkert.org 276498Snate@binkert.org def t_NUMBER(self,t): 286498Snate@binkert.org r'\d+' 296498Snate@binkert.org try: 306498Snate@binkert.org t.value = int(t.value) 316498Snate@binkert.org except ValueError: 326498Snate@binkert.org print("Integer value too large %s" % t.value) 336498Snate@binkert.org t.value = 0 346498Snate@binkert.org return t 356498Snate@binkert.org 366498Snate@binkert.org t_ignore = " \t" 376498Snate@binkert.org 386498Snate@binkert.org def t_newline(self,t): 396498Snate@binkert.org r'\n+' 406498Snate@binkert.org t.lineno += t.value.count("\n") 416498Snate@binkert.org 426498Snate@binkert.org def t_error(self,t): 436498Snate@binkert.org print("Illegal character '%s'" % t.value[0]) 446498Snate@binkert.org t.lexer.skip(1) 456498Snate@binkert.org 466498Snate@binkert.org 476498Snate@binkert.orgcalc = CalcLexer() 486498Snate@binkert.org 496498Snate@binkert.org# Build the lexer 506498Snate@binkert.orglex.lex(object=calc) 516498Snate@binkert.orglex.runmain(data="3+4") 526498Snate@binkert.org 536498Snate@binkert.org 546498Snate@binkert.org 556498Snate@binkert.org 56