diff options
author | Max Fischer <maxfischer2781@gmail.com> | 2021-06-20 12:44:01 +0200 |
---|---|---|
committer | Max Fischer <maxfischer2781@gmail.com> | 2021-06-20 12:44:01 +0200 |
commit | fbbd524a4cc1bc06bbd861c94d426817f27e15a2 (patch) | |
tree | 4fdbbab4bec973a8d128906e7ea275028f5a6916 | |
parent | 4e5813c39a174c1d7a5166abaa725772391a02ba (diff) | |
download | pyparsing-git-fbbd524a4cc1bc06bbd861c94d426817f27e15a2.tar.gz |
tests for associativity and nesting
-rw-r--r-- | tests/test_unit.py | 34 |
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 |