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