Browse Source

Added utility function: List grammar imports + test

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.12.0
Erez Sh 3 years ago
parent
commit
b3816b9a90
2 changed files with 22 additions and 2 deletions
  1. +6
    -0
      lark/load_grammar.py
  2. +16
    -2
      tests/test_grammar.py

+ 6
- 0
lark/load_grammar.py View File

@@ -1336,6 +1336,12 @@ def verify_used_files(file_hashes):
return False return False
return True return True


def list_grammar_imports(grammar, import_paths=[]):
"Returns a list of paths to the lark grammars imported by the given grammar (recursively)"
builder = GrammarBuilder(False, import_paths)
builder.load_grammar(grammar, '<string>')
return list(builder.used_files.keys())

def load_grammar(grammar, source, import_paths, global_keep_all_tokens): def load_grammar(grammar, source, import_paths, global_keep_all_tokens):
builder = GrammarBuilder(global_keep_all_tokens, import_paths) builder = GrammarBuilder(global_keep_all_tokens, import_paths)
builder.load_grammar(grammar, source) builder.load_grammar(grammar, source)


+ 16
- 2
tests/test_grammar.py View File

@@ -1,10 +1,10 @@
from __future__ import absolute_import from __future__ import absolute_import


import sys
import os
from unittest import TestCase, main from unittest import TestCase, main


from lark import Lark, Token, Tree, ParseError, UnexpectedInput from lark import Lark, Token, Tree, ParseError, UnexpectedInput
from lark.load_grammar import GrammarError, GRAMMAR_ERRORS, find_grammar_errors
from lark.load_grammar import GrammarError, GRAMMAR_ERRORS, find_grammar_errors, list_grammar_imports
from lark.load_grammar import FromPackageLoader from lark.load_grammar import FromPackageLoader




@@ -258,6 +258,20 @@ class TestGrammar(TestCase):
for i in (-1, 1000): for i in (-1, 1000):
self.assertRaises(UnexpectedInput, l.parse, str(i)) self.assertRaises(UnexpectedInput, l.parse, str(i))


def test_list_grammar_imports(self):
grammar = """
%import .test_templates_import (start, sep)

%override sep{item, delim}: item (delim item)* delim?
%ignore " "
"""

imports = list_grammar_imports(grammar, [os.path.dirname(__file__)])
self.assertEqual({os.path.split(i)[-1] for i in imports}, {'test_templates_import.lark', 'templates.lark'})

imports = list_grammar_imports('%import common.WS', [])
assert len(imports) == 1 and imports[0].pkg_name == 'lark'



if __name__ == '__main__': if __name__ == '__main__':
main() main()


Loading…
Cancel
Save