From dd3cf90b2d70129bd10bff69da486b3e6eae2e76 Mon Sep 17 00:00:00 2001 From: MegaIng1 Date: Sat, 21 Nov 2020 00:14:15 +0100 Subject: [PATCH 1/2] Moved `lark.lark` into the standard library. --- examples/lark_grammar.py | 10 +++++++--- {examples => lark/grammars}/lark.lark | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) rename {examples => lark/grammars}/lark.lark (96%) diff --git a/examples/lark_grammar.py b/examples/lark_grammar.py index f2185ee..6730db9 100644 --- a/examples/lark_grammar.py +++ b/examples/lark_grammar.py @@ -7,13 +7,13 @@ A reference implementation of the Lark grammar (using LALR(1)) import lark from pathlib import Path -parser = lark.Lark.open('lark.lark', rel_to=__file__, parser="lalr") - examples_path = Path(__file__).parent lark_path = Path(lark.__file__).parent +parser = lark.Lark.open(lark_path / 'grammars/lark.lark', rel_to=__file__, parser="lalr") + + grammar_files = [ - examples_path / 'lark.lark', examples_path / 'advanced/python2.lark', examples_path / 'advanced/python3.lark', examples_path / 'relative-imports/multiples.lark', @@ -21,7 +21,11 @@ grammar_files = [ examples_path / 'relative-imports/multiple3.lark', examples_path / 'tests/no_newline_at_end.lark', examples_path / 'tests/negative_priority.lark', + examples_path / 'standalone/json.lark', lark_path / 'grammars/common.lark', + lark_path / 'grammars/lark.lark', + lark_path / 'grammars/unicode.lark', + lark_path / 'grammars/python.lark', ] def test(): diff --git a/examples/lark.lark b/lark/grammars/lark.lark similarity index 96% rename from examples/lark.lark rename to lark/grammars/lark.lark index 474b819..c16db47 100644 --- a/examples/lark.lark +++ b/lark/grammars/lark.lark @@ -45,7 +45,7 @@ OP: /[+*]|[?](?![a-z])/ RULE: /!?[_?]?[a-z][_a-z0-9]*/ TOKEN: /_?[A-Z][_A-Z0-9]*/ STRING: _STRING "i"? -REGEXP: /\/(?!\/)(\\\/|\\\\|[^\/\n])*?\/[imslux]*/ +REGEXP: /\/(?!\/)(\\\/|\\\\|[^\/])*?\/[imslux]*/ _NL: /(\r?\n)+\s*/ %import common.ESCAPED_STRING -> _STRING From 2fe5f2ed4c396deb7b372bf5a086bdbc646aa7a2 Mon Sep 17 00:00:00 2001 From: MegaIng1 Date: Sat, 21 Nov 2020 00:14:36 +0100 Subject: [PATCH 2/2] Added tests for `lark.lark` --- tests/test_parser.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/tests/test_parser.py b/tests/test_parser.py index 39bd00c..1d9827c 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -30,6 +30,7 @@ try: except ImportError: regex = None +import lark from lark import logger from lark.lark import Lark from lark.exceptions import GrammarError, ParseError, UnexpectedToken, UnexpectedInput, UnexpectedCharacters @@ -942,10 +943,24 @@ class DualBytesLark: def _make_parser_test(LEXER, PARSER): lexer_class_or_name = CustomLexer if LEXER == 'custom' else LEXER - def _Lark(grammar, **kwargs): - return Lark(grammar, lexer=lexer_class_or_name, parser=PARSER, propagate_positions=True, **kwargs) - def _Lark_open(gfilename, **kwargs): - return Lark.open(gfilename, lexer=lexer_class_or_name, parser=PARSER, propagate_positions=True, **kwargs) + if (LEXER, PARSER) == ('standard', 'earley'): + # Check that the `lark.lark` grammar represents can parse every example used in these tests. + # Doesn't matter when we do it, or how often. Just do it for the first entry in `TO_TEST` + lalr_parser = Lark.open(os.path.join(os.path.dirname(lark.__file__), 'grammars/lark.lark'), parser='lalr') + def _Lark(grammar, **kwargs): + inst = Lark(grammar, lexer=lexer_class_or_name, parser=PARSER, propagate_positions=True, **kwargs) + lalr_parser.parse(inst.source_grammar) # Test after instance creation. When the grammar should fail, don't test it. + return inst + def _Lark_open(gfilename, **kwargs): + inst = Lark.open(gfilename, lexer=lexer_class_or_name, parser=PARSER, propagate_positions=True, **kwargs) + lalr_parser.parse(inst.source_grammar) + return inst + else: + def _Lark(grammar, **kwargs): + return Lark(grammar, lexer=lexer_class_or_name, parser=PARSER, propagate_positions=True, **kwargs) + def _Lark_open(gfilename, **kwargs): + return Lark.open(gfilename, lexer=lexer_class_or_name, parser=PARSER, propagate_positions=True, **kwargs) + class _TestParser(unittest.TestCase): def test_basic1(self):