14479Sbinkertn@umich.edu# lexer for yacc-grammars
24479Sbinkertn@umich.edu#
34479Sbinkertn@umich.edu# Author: David Beazley (dave@dabeaz.com)
44479Sbinkertn@umich.edu# Date  : October 2, 2006
54479Sbinkertn@umich.edu
64479Sbinkertn@umich.eduimport sys
74479Sbinkertn@umich.edusys.path.append("../..")
84479Sbinkertn@umich.edu
94479Sbinkertn@umich.edufrom ply import *
104479Sbinkertn@umich.edu
114479Sbinkertn@umich.edutokens = (
124479Sbinkertn@umich.edu    'LITERAL','SECTION','TOKEN','LEFT','RIGHT','PREC','START','TYPE','NONASSOC','UNION','CODE',
134479Sbinkertn@umich.edu    'ID','QLITERAL','NUMBER',
144479Sbinkertn@umich.edu)
154479Sbinkertn@umich.edu
164479Sbinkertn@umich.edustates = (('code','exclusive'),)
174479Sbinkertn@umich.edu
184479Sbinkertn@umich.eduliterals = [ ';', ',', '<', '>', '|',':' ]
194479Sbinkertn@umich.edut_ignore = ' \t'
204479Sbinkertn@umich.edu
214479Sbinkertn@umich.edut_TOKEN     = r'%token'
224479Sbinkertn@umich.edut_LEFT      = r'%left'
234479Sbinkertn@umich.edut_RIGHT     = r'%right'
244479Sbinkertn@umich.edut_NONASSOC  = r'%nonassoc'
254479Sbinkertn@umich.edut_PREC      = r'%prec'
264479Sbinkertn@umich.edut_START     = r'%start'
274479Sbinkertn@umich.edut_TYPE      = r'%type'
284479Sbinkertn@umich.edut_UNION     = r'%union'
294479Sbinkertn@umich.edut_ID        = r'[a-zA-Z_][a-zA-Z_0-9]*'
304479Sbinkertn@umich.edut_QLITERAL  = r'''(?P<quote>['"]).*?(?P=quote)'''
314479Sbinkertn@umich.edut_NUMBER    = r'\d+'
324479Sbinkertn@umich.edu
334479Sbinkertn@umich.edudef t_SECTION(t):
344479Sbinkertn@umich.edu    r'%%'
354479Sbinkertn@umich.edu    if getattr(t.lexer,"lastsection",0):
364479Sbinkertn@umich.edu         t.value = t.lexer.lexdata[t.lexpos+2:]
374479Sbinkertn@umich.edu         t.lexer.lexpos = len(t.lexer.lexdata)
384479Sbinkertn@umich.edu    else:
394479Sbinkertn@umich.edu         t.lexer.lastsection = 0
404479Sbinkertn@umich.edu    return t
414479Sbinkertn@umich.edu
424479Sbinkertn@umich.edu# Comments
434479Sbinkertn@umich.edudef t_ccomment(t):
444479Sbinkertn@umich.edu    r'/\*(.|\n)*?\*/'
456498Snate@binkert.org    t.lexer.lineno += t.value.count('\n')
464479Sbinkertn@umich.edu
474479Sbinkertn@umich.edut_ignore_cppcomment = r'//.*'
484479Sbinkertn@umich.edu
494479Sbinkertn@umich.edudef t_LITERAL(t):
504479Sbinkertn@umich.edu   r'%\{(.|\n)*?%\}'
514479Sbinkertn@umich.edu   t.lexer.lineno += t.value.count("\n")
524479Sbinkertn@umich.edu   return t
534479Sbinkertn@umich.edu
544479Sbinkertn@umich.edudef t_NEWLINE(t):
554479Sbinkertn@umich.edu   r'\n'
564479Sbinkertn@umich.edu   t.lexer.lineno += 1
574479Sbinkertn@umich.edu
584479Sbinkertn@umich.edudef t_code(t):
594479Sbinkertn@umich.edu   r'\{'
604479Sbinkertn@umich.edu   t.lexer.codestart = t.lexpos
614479Sbinkertn@umich.edu   t.lexer.level = 1
624479Sbinkertn@umich.edu   t.lexer.begin('code')
634479Sbinkertn@umich.edu
644479Sbinkertn@umich.edudef t_code_ignore_string(t):
654479Sbinkertn@umich.edu    r'\"([^\\\n]|(\\.))*?\"'
664479Sbinkertn@umich.edu
674479Sbinkertn@umich.edudef t_code_ignore_char(t):
684479Sbinkertn@umich.edu    r'\'([^\\\n]|(\\.))*?\''
694479Sbinkertn@umich.edu
704479Sbinkertn@umich.edudef t_code_ignore_comment(t):
714479Sbinkertn@umich.edu   r'/\*(.|\n)*?\*/'
724479Sbinkertn@umich.edu
734479Sbinkertn@umich.edudef t_code_ignore_cppcom(t):
744479Sbinkertn@umich.edu   r'//.*'
754479Sbinkertn@umich.edu
764479Sbinkertn@umich.edudef t_code_lbrace(t):
774479Sbinkertn@umich.edu    r'\{'
784479Sbinkertn@umich.edu    t.lexer.level += 1
794479Sbinkertn@umich.edu
804479Sbinkertn@umich.edudef t_code_rbrace(t):
814479Sbinkertn@umich.edu    r'\}'
824479Sbinkertn@umich.edu    t.lexer.level -= 1
834479Sbinkertn@umich.edu    if t.lexer.level == 0:
844479Sbinkertn@umich.edu         t.type = 'CODE'
854479Sbinkertn@umich.edu         t.value = t.lexer.lexdata[t.lexer.codestart:t.lexpos+1]
864479Sbinkertn@umich.edu         t.lexer.begin('INITIAL')
874479Sbinkertn@umich.edu         t.lexer.lineno += t.value.count('\n')
884479Sbinkertn@umich.edu         return t
894479Sbinkertn@umich.edu
904479Sbinkertn@umich.edut_code_ignore_nonspace   = r'[^\s\}\'\"\{]+'
914479Sbinkertn@umich.edut_code_ignore_whitespace = r'\s+'
924479Sbinkertn@umich.edut_code_ignore = ""
934479Sbinkertn@umich.edu
944479Sbinkertn@umich.edudef t_code_error(t):
954479Sbinkertn@umich.edu    raise RuntimeError
964479Sbinkertn@umich.edu
974479Sbinkertn@umich.edudef t_error(t):
986498Snate@binkert.org    print "%d: Illegal character '%s'" % (t.lexer.lineno, t.value[0])
994479Sbinkertn@umich.edu    print t.value
1004479Sbinkertn@umich.edu    t.lexer.skip(1)
1014479Sbinkertn@umich.edu
1024479Sbinkertn@umich.edulex.lex()
1034479Sbinkertn@umich.edu
1044479Sbinkertn@umich.eduif __name__ == '__main__':
1054479Sbinkertn@umich.edu    lex.runmain()
1064479Sbinkertn@umich.edu
1076498Snate@binkert.org
1086498Snate@binkert.org
1096498Snate@binkert.org
1104479Sbinkertn@umich.edu
1116498Snate@binkert.org
1124479Sbinkertn@umich.edu
113