From 571bb400e3ca6ba0d262bdbc42d4c969dea47345 Mon Sep 17 00:00:00 2001 From: Erez Shinan Date: Thu, 5 Sep 2019 17:35:17 +0300 Subject: [PATCH] Bugfix for regression (Issue #445) --- lark/load_grammar.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lark/load_grammar.py b/lark/load_grammar.py index 83ee119..90911fd 100644 --- a/lark/load_grammar.py +++ b/lark/load_grammar.py @@ -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))