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