12632Sstever@eecs.umich.edu# -----------------------------------------------------------------------------
22632Sstever@eecs.umich.edu# calclex.py
32632Sstever@eecs.umich.edu# -----------------------------------------------------------------------------
44479Sbinkertn@umich.eduimport sys
54479Sbinkertn@umich.edu
66498Snate@binkert.orgif ".." not in sys.path: sys.path.insert(0,"..")
74479Sbinkertn@umich.eduimport ply.lex as lex
82632Sstever@eecs.umich.edu
92632Sstever@eecs.umich.edutokens = (
102632Sstever@eecs.umich.edu    'NAME','NUMBER',
112632Sstever@eecs.umich.edu    'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
122632Sstever@eecs.umich.edu    'LPAREN','RPAREN',
132632Sstever@eecs.umich.edu    )
142632Sstever@eecs.umich.edu
152632Sstever@eecs.umich.edu# Tokens
162632Sstever@eecs.umich.edu
172632Sstever@eecs.umich.edut_PLUS    = r'\+'
182632Sstever@eecs.umich.edut_MINUS   = r'-'
192632Sstever@eecs.umich.edut_TIMES   = r'\*'
202632Sstever@eecs.umich.edut_DIVIDE  = r'/'
212632Sstever@eecs.umich.edut_EQUALS  = r'='
222632Sstever@eecs.umich.edut_LPAREN  = r'\('
232632Sstever@eecs.umich.edut_RPAREN  = r'\)'
242632Sstever@eecs.umich.edut_NAME    = r'[a-zA-Z_][a-zA-Z0-9_]*'
252632Sstever@eecs.umich.edu
262632Sstever@eecs.umich.edudef t_NUMBER(t):
272632Sstever@eecs.umich.edu    r'\d+'
282632Sstever@eecs.umich.edu    try:
292632Sstever@eecs.umich.edu        t.value = int(t.value)
302632Sstever@eecs.umich.edu    except ValueError:
316498Snate@binkert.org        print("Integer value too large %s" % t.value)
322632Sstever@eecs.umich.edu        t.value = 0
332632Sstever@eecs.umich.edu    return t
342632Sstever@eecs.umich.edu
352632Sstever@eecs.umich.edut_ignore = " \t"
362632Sstever@eecs.umich.edu
372632Sstever@eecs.umich.edudef t_newline(t):
382632Sstever@eecs.umich.edu    r'\n+'
392632Sstever@eecs.umich.edu    t.lineno += t.value.count("\n")
406498Snate@binkert.org
412632Sstever@eecs.umich.edudef t_error(t):
426498Snate@binkert.org    print("Illegal character '%s'" % t.value[0])
434479Sbinkertn@umich.edu    t.lexer.skip(1)
446498Snate@binkert.org
452632Sstever@eecs.umich.edu# Build the lexer
462632Sstever@eecs.umich.edulex.lex()
472632Sstever@eecs.umich.edu
482632Sstever@eecs.umich.edu
492632Sstever@eecs.umich.edu
50