|
|
@@ -11,6 +11,40 @@ from .tree import Tree |
|
|
|
|
|
|
|
###{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): |
|
|
|
lexer = None |
|
|
|
parser = None |
|
|
@@ -66,6 +100,8 @@ class LALR_ContextualLexer(WithLexer): |
|
|
|
self.parser = LALR_Parser(parser_conf, debug=debug) |
|
|
|
self.init_contextual_lexer(lexer_conf) |
|
|
|
|
|
|
|
###} |
|
|
|
|
|
|
|
class LALR_CustomLexer(WithLexer): |
|
|
|
def __init__(self, lexer_cls, lexer_conf, parser_conf, options=None): |
|
|
|
self.parser = LALR_Parser(parser_conf) |
|
|
@@ -159,39 +195,3 @@ class CYK(WithLexer): |
|
|
|
def _apply_callback(self, tree): |
|
|
|
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) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
###} |