From 0c1c48411dafa23aaab28c946d4934f1f6d27bcc Mon Sep 17 00:00:00 2001 From: MegaIng1 Date: Sat, 28 Mar 2020 12:21:47 +0100 Subject: [PATCH] Added test for recursive templates + implemented them --- lark/load_grammar.py | 1 + tests/test_parser.py | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lark/load_grammar.py b/lark/load_grammar.py index 800de4e..16f69ac 100644 --- a/lark/load_grammar.py +++ b/lark/load_grammar.py @@ -384,6 +384,7 @@ class ApplyTemplates(Transformer_InPlace): args = c[1:] result_name = self._get_template_name(name.value, args) if result_name not in self.created_templates: + self.created_templates.add(result_name) (_n, params, tree, options) ,= (t for t in self.temp_defs if t[0] == name) assert len(params) == len(args), args result_tree = deepcopy(tree) diff --git a/tests/test_parser.py b/tests/test_parser.py index d41b028..a664bcc 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -822,7 +822,18 @@ def _make_parser_test(LEXER, PARSER): self.assertSequenceEqual(x.children,['1', '2', '3', '4']) x = g.parse("[1]") self.assertSequenceEqual(x.children,['1']) - print(x) + + def test_templates_recursion(self): + g = _Lark(r""" + start: "[" sep{NUMBER, ","} "]" + sep{item, delim}: item | sep{item, delim} delim item + NUMBER: /\d+/ + %ignore " " + """) + x = g.parse("[1, 2, 3, 4]") + self.assertSequenceEqual(x.children,['1', '2', '3', '4']) + x = g.parse("[1]") + self.assertSequenceEqual(x.children,['1']) def test_token_collision_WS(self): g = _Lark(r"""start: "Hello" NAME