Browse Source

Tiny improvement to the LALR parser

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.6.5
Erez Shinan 7 years ago
parent
commit
106508dcce
1 changed files with 7 additions and 7 deletions
  1. +7
    -7
      lark/parsers/lalr_parser.py

+ 7
- 7
lark/parsers/lalr_parser.py View File

@@ -40,13 +40,13 @@ class _Parser:


if set_state: set_state(self.start_state) if set_state: set_state(self.start_state)


def get_action(key):
def get_action(token):
state = state_stack[-1] state = state_stack[-1]
try: try:
return states[state][key]
return states[state][token.type]
except KeyError: except KeyError:
expected = [s for s in states[state].keys() if s.isupper()] expected = [s for s in states[state].keys() if s.isupper()]
raise UnexpectedToken(token, expected, state=state) # TODO filter out rules from expected
raise UnexpectedToken(token, expected, state=state)


def reduce(rule): def reduce(rule):
size = len(rule.expansion) size = len(rule.expansion)
@@ -59,7 +59,7 @@ class _Parser:


value = self.callbacks[rule](s) value = self.callbacks[rule](s)


_action, new_state = get_action(rule.origin.name)
_action, new_state = states[state_stack[-1]][rule.origin.name]
assert _action is Shift assert _action is Shift
state_stack.append(new_state) state_stack.append(new_state)
value_stack.append(value) value_stack.append(value)
@@ -67,7 +67,7 @@ class _Parser:
# Main LALR-parser loop # Main LALR-parser loop
for token in stream: for token in stream:
while True: while True:
action, arg = get_action(token.type)
action, arg = get_action(token)
assert arg != self.end_state assert arg != self.end_state


if action is Shift: if action is Shift:
@@ -78,9 +78,9 @@ class _Parser:
else: else:
reduce(arg) reduce(arg)


token = Token.new_borrow_pos('<EOF>', token, token) if token else Token('<EOF>', '', 0, 1, 1)
token = Token.new_borrow_pos('$END', '', token) if token else Token('$END', '', 0, 1, 1)
while True: while True:
_action, arg = get_action('$END')
_action, arg = get_action(token)
if _action is Shift: if _action is Shift:
assert arg == self.end_state assert arg == self.end_state
val ,= value_stack val ,= value_stack


Loading…
Cancel
Save