Просмотр исходного кода

Fix puppet, add immutable puppet with hash

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.11.0
Erez Sh 3 лет назад
Родитель
Сommit
ede2ed78ec
2 измененных файлов: 22 добавлений и 6 удалений
  1. +1
    -1
      lark/parsers/lalr_parser.py
  2. +21
    -5
      lark/parsers/lalr_puppet.py

+ 1
- 1
lark/parsers/lalr_parser.py Просмотреть файл

@@ -95,7 +95,7 @@ class ParserState:
assert not is_end
state_stack.append(arg)
value_stack.append(token)
return arg
return
else:
# reduce+shift as many times as necessary
rule = arg


+ 21
- 5
lark/parsers/lalr_puppet.py Просмотреть файл

@@ -22,7 +22,7 @@ class ParserPuppet(object):

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):
"""Create a new puppet with a separate state.
@@ -35,15 +35,18 @@ class ParserPuppet(object):
copy(self.lexer_state),
)

def copy(self):
return copy(self)

def __eq__(self, other):
if not isinstance(other, ParserPuppet):
return False

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):
"""Print the output of ``choices()`` in a way that's easier to read."""
@@ -60,7 +63,7 @@ class ParserPuppet(object):

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):
accepts = set()
@@ -78,3 +81,16 @@ class ParserPuppet(object):
def resume_parse(self):
"""Resume parsing from the current puppet 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

Загрузка…
Отмена
Сохранить