16498Snate@binkert.org# -----------------------------------------------------------------------------
26498Snate@binkert.org# lex_optimize3.py
36498Snate@binkert.org#
46498Snate@binkert.org# Writes table in a subdirectory structure.
56498Snate@binkert.org# -----------------------------------------------------------------------------
66498Snate@binkert.orgimport sys
76498Snate@binkert.org
86498Snate@binkert.orgif ".." not in sys.path: sys.path.insert(0,"..")
96498Snate@binkert.orgimport ply.lex as lex
106498Snate@binkert.org
116498Snate@binkert.orgtokens = (
126498Snate@binkert.org    'NAME','NUMBER',
136498Snate@binkert.org    'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
146498Snate@binkert.org    'LPAREN','RPAREN',
156498Snate@binkert.org    )
166498Snate@binkert.org
176498Snate@binkert.org# Tokens
186498Snate@binkert.org
196498Snate@binkert.orgt_PLUS    = r'\+'
206498Snate@binkert.orgt_MINUS   = r'-'
216498Snate@binkert.orgt_TIMES   = r'\*'
226498Snate@binkert.orgt_DIVIDE  = r'/'
236498Snate@binkert.orgt_EQUALS  = r'='
246498Snate@binkert.orgt_LPAREN  = r'\('
256498Snate@binkert.orgt_RPAREN  = r'\)'
266498Snate@binkert.orgt_NAME    = r'[a-zA-Z_][a-zA-Z0-9_]*'
276498Snate@binkert.org
286498Snate@binkert.orgdef 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.orgt_ignore = " \t"
386498Snate@binkert.org
396498Snate@binkert.orgdef t_newline(t):
406498Snate@binkert.org    r'\n+'
416498Snate@binkert.org    t.lineno += t.value.count("\n")
426498Snate@binkert.org
436498Snate@binkert.orgdef 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.orglex.lex(optimize=1,lextab="lexdir.sub.calctab",outputdir="lexdir/sub")
496498Snate@binkert.orglex.runmain(data="3+4")
506498Snate@binkert.org
516498Snate@binkert.org
526498Snate@binkert.org
53