Browse Source

Merge pull request #975 from lark-parser/list_grammar_imports2

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.12.0
Erez Shinan 3 years ago
committed by GitHub
parent
commit
fbb6a9ede8
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
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