diff options
author | Max Fischer <maxfischer2781@gmail.com> | 2021-06-20 12:04:36 +0200 |
---|---|---|
committer | Max Fischer <maxfischer2781@gmail.com> | 2021-06-20 12:04:36 +0200 |
commit | 4e5813c39a174c1d7a5166abaa725772391a02ba (patch) | |
tree | 510fbeba6ffe7eea0d964544c325db30c404b4c7 | |
parent | fef0b7b5c96fc2eb4fa8b6686b047bd8d73bdaa6 (diff) | |
download | pyparsing-git-4e5813c39a174c1d7a5166abaa725772391a02ba.tar.gz |
basic LR unit test
-rw-r--r-- | pyparsing/testing.py | 3 | ||||
-rw-r--r-- | tests/test_unit.py | 30 |
2 files changed, 33 insertions, 0 deletions
diff --git a/pyparsing/testing.py b/pyparsing/testing.py index 393f37b..f375290 100644 --- a/pyparsing/testing.py +++ b/pyparsing/testing.py @@ -20,6 +20,7 @@ class pyparsing_test: """ Context manager to be used when writing unit tests that modify pyparsing config values: - packrat parsing + - bounded recursion parsing - default whitespace characters. - default keyword characters - literal string auto-conversion class @@ -61,6 +62,7 @@ class pyparsing_test: else: self._save_context["packrat_cache_size"] = None self._save_context["packrat_parse"] = ParserElement._parse + self._save_context["recursion_enabled"] = ParserElement._bounded_recursion_enabled self._save_context["__diag__"] = { name: getattr(__diag__, name) for name in __diag__._all_names @@ -97,6 +99,7 @@ class pyparsing_test: ParserElement.enablePackrat(self._save_context["packrat_cache_size"]) else: ParserElement._parse = self._save_context["packrat_parse"] + ParserElement._bounded_recursion_enabled = self._save_context["recursion_enabled"] __compat__.collect_all_And_tokens = self._save_context["__compat__"] diff --git a/tests/test_unit.py b/tests/test_unit.py index 09ad6a4..2ec771e 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -8067,9 +8067,39 @@ class Test8_WithUnboundedPackrat(Test2_WithoutPackrat): ) +class TestLR1_Recursion(ppt.TestParseResultsAsserts, TestCase): + """ + Tests for recursive parsing + """ + suite_context = None + save_suite_context = None + + def setUp(self): + recursion_suite_context.restore() + + def test_binary_recursive(self): + """Parsing single left-recursive binary operator""" + expr = pp.Forward("expr") + num = pp.Word(pp.nums) + expr <<= expr + '+' - num | num + self.assertParseResultsEquals( + expr.parseString("1+2"), + expected_list=['1', '+', '2'] + ) + self.assertParseResultsEquals( + expr.parseString("1+2+3+4"), + expected_list=['1', '+', '2', '+', '3', '+', '4'] + ) + + # force clear of packrat parsing flags before saving contexts pp.ParserElement._packratEnabled = False pp.ParserElement._parse = pp.ParserElement._parseNoCache Test2_WithoutPackrat.suite_context = ppt.reset_pyparsing_context().save() Test2_WithoutPackrat.save_suite_context = ppt.reset_pyparsing_context().save() + +default_suite_context = ppt.reset_pyparsing_context().save() +pp.ParserElement.enable_bounded_recursion() +recursion_suite_context = ppt.reset_pyparsing_context().save() +default_suite_context.restore() |