| # lexer for yacc-grammars | |
| # | |
| # Author: David Beazley (dave@dabeaz.com) | |
| # Date : October 2, 2006 | |
| import sys | |
| sys.path.append("../..") | |
| from ply import * | |
| tokens = ( | |
| 'LITERAL','SECTION','TOKEN','LEFT','RIGHT','PREC','START','TYPE','NONASSOC','UNION','CODE', | |
| 'ID','QLITERAL','NUMBER', | |
| ) | |
| states = (('code','exclusive'),) | |
| literals = [ ';', ',', '<', '>', '|',':' ] | |
| t_ignore = ' \t' | |
| t_TOKEN = r'%token' | |
| t_LEFT = r'%left' | |
| t_RIGHT = r'%right' | |
| t_NONASSOC = r'%nonassoc' | |
| t_PREC = r'%prec' | |
| t_START = r'%start' | |
| t_TYPE = r'%type' | |
| t_UNION = r'%union' | |
| t_ID = r'[a-zA-Z_][a-zA-Z_0-9]*' | |
| t_QLITERAL = r'''(?P<quote>['"]).*?(?P=quote)''' | |
| t_NUMBER = r'\d+' | |
| def t_SECTION(t): | |
| r'%%' | |
| if getattr(t.lexer,"lastsection",0): | |
| t.value = t.lexer.lexdata[t.lexpos+2:] | |
| t.lexer.lexpos = len(t.lexer.lexdata) | |
| else: | |
| t.lexer.lastsection = 0 | |
| return t | |
| # Comments | |
| def t_ccomment(t): | |
| r'/\*(.|\n)*?\*/' | |
| t.lexer.lineno += t.value.count('\n') | |
| t_ignore_cppcomment = r'//.*' | |
| def t_LITERAL(t): | |
| r'%\{(.|\n)*?%\}' | |
| t.lexer.lineno += t.value.count("\n") | |
| return t | |
| def t_NEWLINE(t): | |
| r'\n' | |
| t.lexer.lineno += 1 | |
| def t_code(t): | |
| r'\{' | |
| t.lexer.codestart = t.lexpos | |
| t.lexer.level = 1 | |
| t.lexer.begin('code') | |
| def t_code_ignore_string(t): | |
| r'\"([^\\\n]|(\\.))*?\"' | |
| def t_code_ignore_char(t): | |
| r'\'([^\\\n]|(\\.))*?\'' | |
| def t_code_ignore_comment(t): | |
| r'/\*(.|\n)*?\*/' | |
| def t_code_ignore_cppcom(t): | |
| r'//.*' | |
| def t_code_lbrace(t): | |
| r'\{' | |
| t.lexer.level += 1 | |
| def t_code_rbrace(t): | |
| r'\}' | |
| t.lexer.level -= 1 | |
| if t.lexer.level == 0: | |
| t.type = 'CODE' | |
| t.value = t.lexer.lexdata[t.lexer.codestart:t.lexpos+1] | |
| t.lexer.begin('INITIAL') | |
| t.lexer.lineno += t.value.count('\n') | |
| return t | |
| t_code_ignore_nonspace = r'[^\s\}\'\"\{]+' | |
| t_code_ignore_whitespace = r'\s+' | |
| t_code_ignore = "" | |
| def t_code_error(t): | |
| raise RuntimeError | |
| def t_error(t): | |
| print "%d: Illegal character '%s'" % (t.lexer.lineno, t.value[0]) | |
| print t.value | |
| t.lexer.skip(1) | |
| lex.lex() | |
| if __name__ == '__main__': | |
| lex.runmain() | |