16498Snate@binkert.org# -----------------------------------------------------------------------------
26498Snate@binkert.org# lex_module_import.py
36498Snate@binkert.org#
46498Snate@binkert.org# A lexer defined in a module, but built in lex_module.py
56498Snate@binkert.org# -----------------------------------------------------------------------------
66498Snate@binkert.org
76498Snate@binkert.orgtokens = (
86498Snate@binkert.org    'NAME','NUMBER',
96498Snate@binkert.org    'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
106498Snate@binkert.org    'LPAREN','RPAREN',
116498Snate@binkert.org    )
126498Snate@binkert.org
136498Snate@binkert.org# Tokens
146498Snate@binkert.org
156498Snate@binkert.orgt_PLUS    = r'\+'
166498Snate@binkert.orgt_MINUS   = r'-'
176498Snate@binkert.orgt_TIMES   = r'\*'
186498Snate@binkert.orgt_DIVIDE  = r'/'
196498Snate@binkert.orgt_EQUALS  = r'='
206498Snate@binkert.orgt_LPAREN  = r'\('
216498Snate@binkert.orgt_RPAREN  = r'\)'
226498Snate@binkert.orgt_NAME    = r'[a-zA-Z_][a-zA-Z0-9_]*'
236498Snate@binkert.org
246498Snate@binkert.orgdef t_NUMBER(t):
256498Snate@binkert.org    r'\d+'
266498Snate@binkert.org    try:
276498Snate@binkert.org        t.value = int(t.value)
286498Snate@binkert.org    except ValueError:
296498Snate@binkert.org        print("Integer value too large %s" % t.value)
306498Snate@binkert.org        t.value = 0
316498Snate@binkert.org    return t
326498Snate@binkert.org
336498Snate@binkert.orgt_ignore = " \t"
346498Snate@binkert.org
356498Snate@binkert.orgdef t_newline(t):
366498Snate@binkert.org    r'\n+'
376498Snate@binkert.org    t.lineno += t.value.count("\n")
386498Snate@binkert.org
396498Snate@binkert.orgdef t_error(t):
406498Snate@binkert.org    print("Illegal character '%s'" % t.value[0])
416498Snate@binkert.org    t.lexer.skip(1)
426498Snate@binkert.org
43