summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Fischer <maxfischer2781@gmail.com>2021-06-20 12:44:01 +0200
committerMax Fischer <maxfischer2781@gmail.com>2021-06-20 12:44:01 +0200
commitfbbd524a4cc1bc06bbd861c94d426817f27e15a2 (patch)
tree4fdbbab4bec973a8d128906e7ea275028f5a6916
parent4e5813c39a174c1d7a5166abaa725772391a02ba (diff)
downloadpyparsing-git-fbbd524a4cc1bc06bbd861c94d426817f27e15a2.tar.gz
tests for associativity and nesting
-rw-r--r--tests/test_unit.py34
1 files changed, 33 insertions, 1 deletions
diff --git a/tests/test_unit.py b/tests/test_unit.py
index 2ec771e..7628e33 100644
--- a/tests/test_unit.py
+++ b/tests/test_unit.py
@@ -8077,8 +8077,11 @@ class TestLR1_Recursion(ppt.TestParseResultsAsserts, TestCase):
def setUp(self):
recursion_suite_context.restore()
+ def tearDown(self):
+ default_suite_context.restore()
+
def test_binary_recursive(self):
- """Parsing single left-recursive binary operator"""
+ """parsing of single left-recursive binary operator"""
expr = pp.Forward("expr")
num = pp.Word(pp.nums)
expr <<= expr + '+' - num | num
@@ -8091,6 +8094,35 @@ class TestLR1_Recursion(ppt.TestParseResultsAsserts, TestCase):
expected_list=['1', '+', '2', '+', '3', '+', '4']
)
+ def test_binary_associative(self):
+ """associative is preserved for single left-recursive binary operator"""
+ expr = pp.Forward("expr")
+ num = pp.Word(pp.nums)
+ expr <<= pp.Group(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'],
+ )
+
+ def test_add_sub(self):
+ """indirectly left-recursive/associative add/sub calculator"""
+ expr = pp.Forward("expr")
+ num = pp.Word(pp.nums).setParseAction(lambda t: int(t[0]))
+ expr <<= (
+ (expr + '+' - num).setParseAction(lambda t: t[0] + t[2])
+ | (expr + '-' - num).setParseAction(lambda t: t[0] - t[2])
+ | num
+ )
+ self.assertEqual(expr.parseString("1+2")[0], 3)
+ self.assertEqual(expr.parseString("1+2+3")[0], 6)
+ self.assertEqual(expr.parseString("1+2-3")[0], 0)
+ self.assertEqual(expr.parseString("1-2+3")[0], 2)
+ self.assertEqual(expr.parseString("1-2-3")[0], -4)
+
# force clear of packrat parsing flags before saving contexts
pp.ParserElement._packratEnabled = False