|
@@ -22,7 +22,7 @@ class ParserPuppet(object): |
|
|
|
|
|
|
|
|
Note that ``token`` has to be an instance of ``Token``. |
|
|
Note that ``token`` has to be an instance of ``Token``. |
|
|
""" |
|
|
""" |
|
|
return self.parser_state.feed_token(token) |
|
|
|
|
|
|
|
|
return self.parser_state.feed_token(token, token.type == '$END') |
|
|
|
|
|
|
|
|
def __copy__(self): |
|
|
def __copy__(self): |
|
|
"""Create a new puppet with a separate state. |
|
|
"""Create a new puppet with a separate state. |
|
@@ -35,15 +35,18 @@ class ParserPuppet(object): |
|
|
copy(self.lexer_state), |
|
|
copy(self.lexer_state), |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
def copy(self): |
|
|
|
|
|
return copy(self) |
|
|
|
|
|
|
|
|
def __eq__(self, other): |
|
|
def __eq__(self, other): |
|
|
if not isinstance(other, ParserPuppet): |
|
|
if not isinstance(other, ParserPuppet): |
|
|
return False |
|
|
return False |
|
|
|
|
|
|
|
|
return self.parser_state == other.parser_state and self.lexer_state == other.lexer_state |
|
|
return self.parser_state == other.parser_state and self.lexer_state == other.lexer_state |
|
|
|
|
|
|
|
|
# TODO Provide with an immutable puppet instance |
|
|
|
|
|
# def __hash__(self): |
|
|
|
|
|
# return hash((self.parser_state, self.lexer_state)) |
|
|
|
|
|
|
|
|
def as_immutable(self): |
|
|
|
|
|
p = copy(self) |
|
|
|
|
|
return ImmutableParserPuppet(p.parser, p.parser_state, p.lexer_state) |
|
|
|
|
|
|
|
|
def pretty(self): |
|
|
def pretty(self): |
|
|
"""Print the output of ``choices()`` in a way that's easier to read.""" |
|
|
"""Print the output of ``choices()`` in a way that's easier to read.""" |
|
@@ -60,7 +63,7 @@ class ParserPuppet(object): |
|
|
|
|
|
|
|
|
Updated by ``feed_token()``. |
|
|
Updated by ``feed_token()``. |
|
|
""" |
|
|
""" |
|
|
return self.parser_state.parse_table.states[self.parser_state.position] |
|
|
|
|
|
|
|
|
return self.parser_state.parse_conf.parse_table.states[self.parser_state.position] |
|
|
|
|
|
|
|
|
def accepts(self): |
|
|
def accepts(self): |
|
|
accepts = set() |
|
|
accepts = set() |
|
@@ -78,3 +81,16 @@ class ParserPuppet(object): |
|
|
def resume_parse(self): |
|
|
def resume_parse(self): |
|
|
"""Resume parsing from the current puppet state.""" |
|
|
"""Resume parsing from the current puppet state.""" |
|
|
return self.parser.parse_from_state(self.parser_state) |
|
|
return self.parser.parse_from_state(self.parser_state) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ImmutableParserPuppet(ParserPuppet): |
|
|
|
|
|
result = None |
|
|
|
|
|
|
|
|
|
|
|
def __hash__(self): |
|
|
|
|
|
return hash((self.parser_state, self.lexer_state)) |
|
|
|
|
|
|
|
|
|
|
|
def feed_token(self, token): |
|
|
|
|
|
c = copy(self) |
|
|
|
|
|
c.result = ParserPuppet.feed_token(c, token) |
|
|
|
|
|
return c |