summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Fischer <maxfischer2781@gmail.com>2021-06-20 12:04:36 +0200
committerMax Fischer <maxfischer2781@gmail.com>2021-06-20 12:04:36 +0200
commit4e5813c39a174c1d7a5166abaa725772391a02ba (patch)
tree510fbeba6ffe7eea0d964544c325db30c404b4c7
parentfef0b7b5c96fc2eb4fa8b6686b047bd8d73bdaa6 (diff)
downloadpyparsing-git-4e5813c39a174c1d7a5166abaa725772391a02ba.tar.gz
basic LR unit test
-rw-r--r--pyparsing/testing.py3
-rw-r--r--tests/test_unit.py30
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()