Browse Source

Bugfix for regression (Issue #445)

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.7.5
Erez Shinan 5 years ago
parent
commit
571bb400e3
1 changed files with 9 additions and 5 deletions
  1. +9
    -5
      lark/load_grammar.py

+ 9
- 5
lark/load_grammar.py View File

@@ -608,8 +608,9 @@ def import_from_grammar_into_namespace(grammar, namespace, aliases):
_, tree, _ = imported_rules[symbol]
except KeyError:
raise GrammarError("Missing symbol '%s' in grammar %s" % (symbol, namespace))
tree = next(tree.find_data("expansion")) # Skip "alias" or other annotations
return tree.scan_values(lambda x: x.type in ('RULE', 'TERMINAL'))

return _find_used_symbols(tree)


def get_namespace_name(name):
try:
@@ -686,6 +687,11 @@ class PrepareGrammar(Transformer_InPlace):
return name


def _find_used_symbols(tree):
assert tree.data == 'expansions'
return {t for x in tree.find_data('expansion')
for t in x.scan_values(lambda t: t.type in ('RULE', 'TERMINAL'))}

class GrammarLoader:
def __init__(self):
terminals = [TerminalDef(name, PatternRE(value)) for name, value in TERMINALS.items()]
@@ -847,9 +853,7 @@ class GrammarLoader:
rule_names.add(name)

for name, expansions, _o in rules:
used_symbols = {t for x in expansions.find_data('expansion')
for t in x.scan_values(lambda t: t.type in ('RULE', 'TERMINAL'))}
for sym in used_symbols:
for sym in _find_used_symbols(expansions):
if sym.type == 'TERMINAL':
if sym not in terminal_names:
raise GrammarError("Token '%s' used but not defined (in rule %s)" % (sym, name))


Loading…
Cancel
Save