From 977025fded8a5e58a3764ab4793fba827ca2bb18 Mon Sep 17 00:00:00 2001 From: Erez Shinan Date: Sat, 11 Feb 2017 17:11:30 +0200 Subject: [PATCH] Small parser optimization --- lark/parsers/lalr_analysis.py | 4 +++- lark/parsers/lalr_parser.py | 14 +++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lark/parsers/lalr_analysis.py b/lark/parsers/lalr_analysis.py index c924937..569c6f3 100644 --- a/lark/parsers/lalr_analysis.py +++ b/lark/parsers/lalr_analysis.py @@ -196,7 +196,9 @@ class GrammarAnalyzer(object): self.states_idx = {} for s, la in self.states.items(): - la = {k:(ACTION_SHIFT, self.enum_rev[v[1]]) if v[0]=='shift' else v for k,v in la.items()} + la = {k:(ACTION_SHIFT, self.enum_rev[v[1]]) if v[0]=='shift' + else (v[0], (v[1], len(v[1].expansion))) # Reduce + for k,v in la.items()} self.states_idx[ self.enum_rev[s] ] = la diff --git a/lark/parsers/lalr_parser.py b/lark/parsers/lalr_parser.py index bdf678a..ada9b1e 100644 --- a/lark/parsers/lalr_parser.py +++ b/lark/parsers/lalr_parser.py @@ -45,11 +45,11 @@ class Parser(object): raise UnexpectedToken(token, expected, seq, i) - def reduce(rule): - if rule.expansion: - s = value_stack[-len(rule.expansion):] - del state_stack[-len(rule.expansion):] - del value_stack[-len(rule.expansion):] + def reduce(rule, size): + if size: + s = value_stack[-size:] + del state_stack[-size:] + del value_stack[-size:] else: s = [] @@ -72,12 +72,12 @@ class Parser(object): value_stack.append(seq[i]) i+= 1 else: - reduce(arg) + reduce(*arg) while True: _action, rule = get_action('$end') assert _action == 'reduce' - res = reduce(rule) + res = reduce(*rule) if res: assert state_stack == [self.ga.init_state_idx] and not value_stack, len(state_stack) return res