diff --git a/lark/load_grammar.py b/lark/load_grammar.py index b638a71..3608fcb 100644 --- a/lark/load_grammar.py +++ b/lark/load_grammar.py @@ -597,6 +597,8 @@ def import_from_grammar_into_namespace(grammar, namespace, aliases): try: return aliases[name].value except KeyError: + if name[0] == '_': + return '_%s__%s' % (namespace, name[1:]) return '%s__%s' % (namespace, name) to_import = list(bfs(aliases, rule_dependencies)) diff --git a/tests/grammars/leading_underscore_grammar.lark b/tests/grammars/leading_underscore_grammar.lark new file mode 100644 index 0000000..b09a2f4 --- /dev/null +++ b/tests/grammars/leading_underscore_grammar.lark @@ -0,0 +1,6 @@ +A: "A" + +_SEP: "x" +_a: A + +c: _a _SEP \ No newline at end of file diff --git a/tests/test_parser.py b/tests/test_parser.py index 7cd7dd8..92f2f06 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -1099,6 +1099,11 @@ def _make_parser_test(LEXER, PARSER): x = l.parse('12 capybaras') self.assertEqual(x.children, ['12', 'capybaras']) + def test_relative_import_preserves_leading_underscore(self): + l = _Lark_open("test_relative_import_preserves_leading_underscore.lark", rel_to=__file__) + x = l.parse('Ax') + self.assertEqual(next(x.find_data('c')).children, ['A']) + def test_import_errors(self): grammar = """ start: NUMBER WORD diff --git a/tests/test_relative_import_preserves_leading_underscore.lark b/tests/test_relative_import_preserves_leading_underscore.lark new file mode 100644 index 0000000..92c08c6 --- /dev/null +++ b/tests/test_relative_import_preserves_leading_underscore.lark @@ -0,0 +1,3 @@ +start: c + +%import .grammars.leading_underscore_grammar.c \ No newline at end of file