Browse Source

Added test for recursive templates + implemented them

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.8.6
MegaIng1 5 years ago
parent
commit
0c1c48411d
2 changed files with 13 additions and 1 deletions
  1. +1
    -0
      lark/load_grammar.py
  2. +12
    -1
      tests/test_parser.py

+ 1
- 0
lark/load_grammar.py View File

@@ -384,6 +384,7 @@ class ApplyTemplates(Transformer_InPlace):
args = c[1:] args = c[1:]
result_name = self._get_template_name(name.value, args) result_name = self._get_template_name(name.value, args)
if result_name not in self.created_templates: 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) (_n, params, tree, options) ,= (t for t in self.temp_defs if t[0] == name)
assert len(params) == len(args), args assert len(params) == len(args), args
result_tree = deepcopy(tree) result_tree = deepcopy(tree)


+ 12
- 1
tests/test_parser.py View File

@@ -822,7 +822,18 @@ def _make_parser_test(LEXER, PARSER):
self.assertSequenceEqual(x.children,['1', '2', '3', '4']) self.assertSequenceEqual(x.children,['1', '2', '3', '4'])
x = g.parse("[1]") x = g.parse("[1]")
self.assertSequenceEqual(x.children,['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): def test_token_collision_WS(self):
g = _Lark(r"""start: "Hello" NAME g = _Lark(r"""start: "Hello" NAME


Loading…
Cancel
Save