diff --git a/arpeggio/__init__.py b/arpeggio/__init__.py index 4b32d8e1a2cf45ef8bb4d2c0eb538b579bd917ad..cdbcca70bc80ddc7c1272294b1882f10c4836723 100644 --- a/arpeggio/__init__.py +++ b/arpeggio/__init__.py @@ -292,7 +292,7 @@ class OrderedChoice(Sequence): c_pos = parser.position for e in self.nodes: try: - result = e.parse(parser) + result = [e.parse(parser)] match = True except NoMatch as m: parser.position = c_pos # Backtracking diff --git a/tests/unit/test_python_parser.py b/tests/unit/test_python_parser.py index 25d688efd06badef8896f3ca02cc0bf2f4f1db9e..f16dd80d763f0f1a12da7bcb9c59d5f0a75f94d0 100644 --- a/tests/unit/test_python_parser.py +++ b/tests/unit/test_python_parser.py @@ -43,14 +43,3 @@ def test_parse_input(): assert str(result) == "4 | + | 5 | * | 7 | / | 3.45 | * | - | 45 | * | ( | 2.56 | + | 32 | ) | / | - | 56 | * | ( | 2 | - | 1.34 | ) | " assert repr(result) == "[ [ [ [ number '4' [0] ] ], '+' [1], [ [ number '5' [2] ], '*' [3], [ number '7' [4] ], '/' [5], [ number '3.45' [6] ], '*' [10], [ '-' [11], number '45' [12] ], '*' [14], [ '(' [15], [ [ [ number '2.56' [16] ] ], '+' [20], [ [ number '32' [21] ] ] ], ')' [23] ], '/' [24], [ '-' [25], number '56' [26] ], '*' [28], [ '(' [29], [ [ [ number '2' [30] ] ], '-' [31], [ [ number '1.34' [32] ] ] ], ')' [36] ] ] ], EOF [37] ]" -def test_reduce_tree(): - - parser = ParserPython(calc, reduce_tree=True) - input = "4+5*7/3.45*-45*(2.56+32)/-56*(2-1.34)" - result = parser.parse(input) - - assert isinstance(result, NonTerminal) - - assert str(result) == "4 | + | 5 | * | 7 | / | 3.45 | * | - | 45 | * | ( | 2.56 | + | 32 | ) | / | - | 56 | * | ( | 2 | - | 1.34 | ) | " - assert repr(result) == "[ [ number '4' [0], '+' [1], [ number '5' [2], '*' [3], number '7' [4], '/' [5], number '3.45' [6], '*' [10], [ '-' [11], number '45' [12] ], '*' [14], [ '(' [15], [ number '2.56' [16], '+' [20], number '32' [21] ], ')' [23] ], '/' [24], [ '-' [25], number '56' [26] ], '*' [28], [ '(' [29], [ number '2' [30], '-' [31], number '1.34' [32] ], ')' [36] ] ] ], EOF [37] ]" - diff --git a/tests/unit/test_reduce_tree.py b/tests/unit/test_reduce_tree.py new file mode 100644 index 0000000000000000000000000000000000000000..624707fc843903d8c14b70e8ab806b6eb0260589 --- /dev/null +++ b/tests/unit/test_reduce_tree.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +####################################################################### +# Name: test_reduce_tree +# Purpose: Test parse tree reduction +# Author: Igor R. Dejanović <igor DOT dejanovic AT gmail DOT com> +# Copyright: (c) 2014 Igor R. Dejanović <igor DOT dejanovic AT gmail DOT com> +# License: MIT License +####################################################################### + +import pytest + +# Grammar +from arpeggio import ZeroOrMore, OneOrMore, ParserPython, Terminal, NonTerminal +from arpeggio.export import PTDOTExporter +from arpeggio import RegExMatch as _ + +def grammar(): return first, "a", second, [first, second] +def first(): return [fourth, third], ZeroOrMore(third) +def second(): return OneOrMore(third), "b" +def third(): return [third_str, fourth] +def third_str(): return "3" +def fourth(): return _(r'\d+') + + +def test_reduce_tree(): + + input = "34 a 3 3 b 3 b" + + parser = ParserPython(grammar, reduce_tree=False) + result = parser.parse(input) + +# PTDOTExporter().exportFile(result, 'test_reduce_tree_pt.dot') + + assert result[0].rule == 'first' + assert isinstance(result[0], NonTerminal) + assert result[3].rule == 'first' + assert result[0][0].rule == 'fourth' + # Check reduction for direct OrderedChoice + assert result[2][0].rule == 'third' + + parser = ParserPython(grammar, reduce_tree=True) + result = parser.parse(input) + + # PTDOTExporter().exportFile(result, 'test_reduce_tree_pt.dot') + + assert result[0].rule == 'fourth' + assert isinstance(result[0], Terminal) + assert result[3].rule == 'fourth' + # Check reduction for direct OrderedChoice + assert result[2][0].rule == 'third_str' +