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