diff --git a/lark/parser_frontends.py b/lark/parser_frontends.py index 6a36e1f..202382b 100644 --- a/lark/parser_frontends.py +++ b/lark/parser_frontends.py @@ -34,7 +34,11 @@ def get_frontend(parser, lexer): super(LALR_CustomLexerWrapper, self).__init__( lexer, lexer_conf, parser_conf, options=options) def init_lexer(self): - self.lexer = CustomLexerWrapper(self.lexer_conf) + future_interface = getattr(lexer, '__future_interface__', False) + if future_interface: + self.lexer = lexer(self.lexer_conf) + else: + self.lexer = CustomLexerWrapper(self.lexer_conf) return LALR_CustomLexerWrapper else: diff --git a/lark/parsers/lalr_parser.py b/lark/parsers/lalr_parser.py index 89f3633..e5bb2a1 100644 --- a/lark/parsers/lalr_parser.py +++ b/lark/parsers/lalr_parser.py @@ -2,7 +2,7 @@ """ # Author: Erez Shinan (2017) # Email : erezshin@gmail.com -from copy import deepcopy +from copy import deepcopy, copy from ..exceptions import UnexpectedCharacters, UnexpectedInput, UnexpectedToken from ..lexer import Token @@ -61,10 +61,13 @@ class ParserState: self.lexer, # XXX copy self.callbacks, self.start, - list(self.state_stack), + copy(self.state_stack), deepcopy(self.value_stack), ) + def copy(self): + return copy(self) + def feed_token(self, token, is_end=False): state_stack = self.state_stack value_stack = self.value_stack diff --git a/lark/parsers/lalr_puppet.py b/lark/parsers/lalr_puppet.py index e7e8b95..9cda395 100644 --- a/lark/parsers/lalr_puppet.py +++ b/lark/parsers/lalr_puppet.py @@ -41,8 +41,9 @@ class ParserPuppet(object): return self.parser_state == other.parser_state and self.lexer_state == other.lexer_state - def __hash__(self): - return hash((self.parser_state, self.lexer_state)) + # TODO Provide with an immutable puppet instance + # def __hash__(self): + # return hash((self.parser_state, self.lexer_state)) def pretty(self): """Print the output of ``choices()`` in a way that's easier to read."""