| @@ -11,6 +11,40 @@ from .tree import Tree | |||||
| ###{standalone | ###{standalone | ||||
| def get_frontend(parser, lexer): | |||||
| if parser=='lalr': | |||||
| if lexer is None: | |||||
| raise ValueError('The LALR parser requires use of a lexer') | |||||
| elif lexer == 'standard': | |||||
| return LALR_TraditionalLexer | |||||
| elif lexer == 'contextual': | |||||
| return LALR_ContextualLexer | |||||
| elif issubclass(lexer, Lexer): | |||||
| return partial(LALR_CustomLexer, lexer) | |||||
| else: | |||||
| raise ValueError('Unknown lexer: %s' % lexer) | |||||
| elif parser=='earley': | |||||
| if lexer=='standard': | |||||
| return Earley | |||||
| elif lexer=='dynamic': | |||||
| return XEarley | |||||
| elif lexer=='dynamic_complete': | |||||
| return XEarley_CompleteLex | |||||
| elif lexer=='contextual': | |||||
| raise ValueError('The Earley parser does not support the contextual parser') | |||||
| else: | |||||
| raise ValueError('Unknown lexer: %s' % lexer) | |||||
| elif parser == 'cyk': | |||||
| if lexer == 'standard': | |||||
| return CYK | |||||
| else: | |||||
| raise ValueError('CYK parser requires using standard parser.') | |||||
| else: | |||||
| raise ValueError('Unknown parser: %s' % parser) | |||||
| class WithLexer(Serialize): | class WithLexer(Serialize): | ||||
| lexer = None | lexer = None | ||||
| parser = None | parser = None | ||||
| @@ -66,6 +100,8 @@ class LALR_ContextualLexer(WithLexer): | |||||
| self.parser = LALR_Parser(parser_conf, debug=debug) | self.parser = LALR_Parser(parser_conf, debug=debug) | ||||
| self.init_contextual_lexer(lexer_conf) | self.init_contextual_lexer(lexer_conf) | ||||
| ###} | |||||
| class LALR_CustomLexer(WithLexer): | class LALR_CustomLexer(WithLexer): | ||||
| def __init__(self, lexer_cls, lexer_conf, parser_conf, options=None): | def __init__(self, lexer_cls, lexer_conf, parser_conf, options=None): | ||||
| self.parser = LALR_Parser(parser_conf) | self.parser = LALR_Parser(parser_conf) | ||||
| @@ -159,39 +195,3 @@ class CYK(WithLexer): | |||||
| def _apply_callback(self, tree): | def _apply_callback(self, tree): | ||||
| return self.callbacks[tree.rule](tree.children) | return self.callbacks[tree.rule](tree.children) | ||||
| def get_frontend(parser, lexer): | |||||
| if parser=='lalr': | |||||
| if lexer is None: | |||||
| raise ValueError('The LALR parser requires use of a lexer') | |||||
| elif lexer == 'standard': | |||||
| return LALR_TraditionalLexer | |||||
| elif lexer == 'contextual': | |||||
| return LALR_ContextualLexer | |||||
| elif issubclass(lexer, Lexer): | |||||
| return partial(LALR_CustomLexer, lexer) | |||||
| else: | |||||
| raise ValueError('Unknown lexer: %s' % lexer) | |||||
| elif parser=='earley': | |||||
| if lexer=='standard': | |||||
| return Earley | |||||
| elif lexer=='dynamic': | |||||
| return XEarley | |||||
| elif lexer=='dynamic_complete': | |||||
| return XEarley_CompleteLex | |||||
| elif lexer=='contextual': | |||||
| raise ValueError('The Earley parser does not support the contextual parser') | |||||
| else: | |||||
| raise ValueError('Unknown lexer: %s' % lexer) | |||||
| elif parser == 'cyk': | |||||
| if lexer == 'standard': | |||||
| return CYK | |||||
| else: | |||||
| raise ValueError('CYK parser requires using standard parser.') | |||||
| else: | |||||
| raise ValueError('Unknown parser: %s' % parser) | |||||
| ###} | |||||