lexer_factory.add_literal('VERSION', 'version') lexer_factory.add_literal('EMAIL', 'email') lexer_factory.add_literal('SEMICOLON', ';') lexer_factory.add_literal('COLON', ',') lexer_factory.add_literal('MINUS', '-') lexer_factory.add_literal('EQ', '=') lexer_factory.add_literal('PERIOD', '.') lexer_factory.add_literal('COMMA', ':') lexer_factory.add_literal('LCURLY', '{') lexer_factory.add_literal('RCURLY', '}') lexer_factory.add_literal('LPAREN', '(') lexer_factory.add_literal('RPAREN', ')') lexer_factory.add_literal('PRECSYM', '%prec') lexer_factory.add_literal('ERRSYM', '%error') lexer_factory.add_literal('WARNSYM', '%warning') lexer_factory.add_token('ID', '[a-zA-Z_][a-zA-Z0-9_]*') lexer_factory.add_token('STRING', '\'([^\'\\\\]+|\\\\.)*\'') lexer_factory.add_token('INTEGER', '[+-]?(0|[1-9][0-9]*)') Lexer = lexer_factory.create_class() # AST nodes metainfo = ast.Metainfo() AlpScript_properties = ( ('head', ast.REQUIRED), ('body', ast.REQUIRED), ) AlpScript_info = ast.Info('AlpScript', AlpScript_properties) AlpScript = AlpScript_info.get_class(metainfo) AlpHead_properties = (
class ParserError(Exception): '''Parse-related errors''' def __init__(self, ctx): super(ParserError, self).__init__('Parsing input failed') self.context = ctx def __str__(self): orig = super(ParserError, self).__str__() return '%s\n%s' % (orig, self.context.summary) # Lexer lexer_factory = LexerFactory() lexer_factory.add_ignore_token('SPACES', '\s+'); lexer_factory.add_token('NAME', '[a-zA-Z_][a-zA-Z0-9]*') lexer_factory.add_token('NUMBER', '(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?') lexer_factory.add_literal('EQ', '=') lexer_factory.add_literal('ADD', '+') lexer_factory.add_literal('SUB', '-') lexer_factory.add_literal('MUL', '*') lexer_factory.add_literal('DIV', '/') lexer_factory.add_literal('POW', '^') lexer_factory.add_literal('COMMA', ',') lexer_factory.add_literal('LPAREN', '(') lexer_factory.add_literal('RPAREN', ')') lexer_factory.add_keyword('for'); lexer_factory.add_keyword('do'); lexer_factory.add_keyword('to'); lexer_factory.add_keyword('step'); lexer_factory.add_keyword('def');