Ver código fonte

Small parser optimization

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.5.1
Erez Shinan 7 anos atrás
pai
commit
977025fded
2 arquivos alterados com 10 adições e 8 exclusões
  1. +3
    -1
      lark/parsers/lalr_analysis.py
  2. +7
    -7
      lark/parsers/lalr_parser.py

+ 3
- 1
lark/parsers/lalr_analysis.py Ver arquivo

@@ -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




+ 7
- 7
lark/parsers/lalr_parser.py Ver arquivo

@@ -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


Carregando…
Cancelar
Salvar