From 24f86569da4dc67b0c96bf47e990851cdecedf72 Mon Sep 17 00:00:00 2001 From: Erez Shinan Date: Thu, 9 Mar 2017 09:45:56 +0200 Subject: [PATCH] Fixed issue #3 (infinite recursion in grammar) --- lark/parsers/earley.py | 2 ++ tests/test_parser.py | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/lark/parsers/earley.py b/lark/parsers/earley.py index d1ec543c..49f9ed7c 100644 --- a/lark/parsers/earley.py +++ b/lark/parsers/earley.py @@ -105,6 +105,8 @@ def add(self, items): new_tree = old_tree.copy() new_tree.rule = old_tree.rule old_tree.set('ambig', [new_tree]) + if item.tree.children[0] is old_tree: # XXX a little hacky! + raise ParseError("Infinite recursion in grammar!") old_tree.children.append(item.tree) else: self.completed[item] = item diff --git a/tests/test_parser.py b/tests/test_parser.py index c4ef4bff..d3bf3947 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -39,6 +39,16 @@ def test_same_ast(self): l2 = g.parse('(a,b,c,*x)') assert l == l2, '%s != %s' % (l.pretty(), l2.pretty()) + def test_infinite_recurse(self): + g = """start: a + a: a | "a" + """ + + self.assertRaises(GrammarError, Lark, g, parser='lalr') + + l = Lark(g, parser='earley') + self.assertRaises(ParseError, l.parse, 'a') + class TestEarley(unittest.TestCase): def test_anon_in_scanless(self):