16498Snate@binkert.org# ----------------------------------------------------------------------------- 26498Snate@binkert.org# lex_opt_alias.py 36498Snate@binkert.org# 46498Snate@binkert.org# Tests ability to match up functions with states, aliases, and 56498Snate@binkert.org# lexing tables. 66498Snate@binkert.org# ----------------------------------------------------------------------------- 76498Snate@binkert.org 86498Snate@binkert.orgimport sys 96498Snate@binkert.orgif ".." not in sys.path: sys.path.insert(0,"..") 106498Snate@binkert.org 116498Snate@binkert.orgtokens = ( 126498Snate@binkert.org 'NAME','NUMBER', 136498Snate@binkert.org ) 146498Snate@binkert.org 156498Snate@binkert.orgstates = (('instdef','inclusive'),('spam','exclusive')) 166498Snate@binkert.org 176498Snate@binkert.orgliterals = ['=','+','-','*','/', '(',')'] 186498Snate@binkert.org 196498Snate@binkert.org# Tokens 206498Snate@binkert.org 216498Snate@binkert.orgdef t_instdef_spam_BITS(t): 226498Snate@binkert.org r'[01-]+' 236498Snate@binkert.org return t 246498Snate@binkert.org 256498Snate@binkert.orgt_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*' 266498Snate@binkert.org 276498Snate@binkert.orgdef NUMBER(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.orgt_ANY_NUMBER = NUMBER 376498Snate@binkert.org 386498Snate@binkert.orgt_ignore = " \t" 396498Snate@binkert.orgt_spam_ignore = t_ignore 406498Snate@binkert.org 416498Snate@binkert.orgdef t_newline(t): 426498Snate@binkert.org r'\n+' 436498Snate@binkert.org t.lexer.lineno += t.value.count("\n") 446498Snate@binkert.org 456498Snate@binkert.orgdef t_error(t): 466498Snate@binkert.org print("Illegal character '%s'" % t.value[0]) 476498Snate@binkert.org t.lexer.skip(1) 486498Snate@binkert.org 496498Snate@binkert.orgt_spam_error = t_error 506498Snate@binkert.org 516498Snate@binkert.org# Build the lexer 526498Snate@binkert.orgimport ply.lex as lex 536498Snate@binkert.orglex.lex(optimize=1,lextab="aliastab") 546498Snate@binkert.orglex.runmain(data="3+4") 55