|
|
@@ -460,6 +460,221 @@ def _make_full_earley_test(LEXER): |
|
|
|
]) |
|
|
|
self.assertEqual(res, expected) |
|
|
|
|
|
|
|
def test_ambiguous_intermediate_node(self): |
|
|
|
grammar = """ |
|
|
|
start: ab bc d? |
|
|
|
!ab: "A" "B"? |
|
|
|
!bc: "B"? "C" |
|
|
|
!d: "D" |
|
|
|
""" |
|
|
|
|
|
|
|
l = Lark(grammar, parser='earley', ambiguity='explicit', lexer=LEXER) |
|
|
|
ambig_tree = l.parse("ABCD") |
|
|
|
expected = { |
|
|
|
Tree('start', [Tree('ab', ['A']), Tree('bc', ['B', 'C']), Tree('d', ['D'])]), |
|
|
|
Tree('start', [Tree('ab', ['A', 'B']), Tree('bc', ['C']), Tree('d', ['D'])]) |
|
|
|
} |
|
|
|
self.assertEqual(ambig_tree.data, '_ambig') |
|
|
|
self.assertEqual(set(ambig_tree.children), expected) |
|
|
|
|
|
|
|
def test_ambiguous_symbol_and_intermediate_nodes(self): |
|
|
|
grammar = """ |
|
|
|
start: ab bc cd |
|
|
|
!ab: "A" "B"? |
|
|
|
!bc: "B"? "C"? |
|
|
|
!cd: "C"? "D" |
|
|
|
""" |
|
|
|
|
|
|
|
l = Lark(grammar, parser='earley', ambiguity='explicit', lexer=LEXER) |
|
|
|
ambig_tree = l.parse("ABCD") |
|
|
|
expected = { |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A', 'B']), |
|
|
|
Tree('bc', ['C']), |
|
|
|
Tree('cd', ['D']) |
|
|
|
]), |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A', 'B']), |
|
|
|
Tree('bc', []), |
|
|
|
Tree('cd', ['C', 'D']) |
|
|
|
]), |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A']), |
|
|
|
Tree('bc', ['B', 'C']), |
|
|
|
Tree('cd', ['D']) |
|
|
|
]), |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A']), |
|
|
|
Tree('bc', ['B']), |
|
|
|
Tree('cd', ['C', 'D']) |
|
|
|
]), |
|
|
|
} |
|
|
|
self.assertEqual(ambig_tree.data, '_ambig') |
|
|
|
self.assertEqual(set(ambig_tree.children), expected) |
|
|
|
|
|
|
|
def test_nested_ambiguous_intermediate_nodes(self): |
|
|
|
grammar = """ |
|
|
|
start: ab bc cd e? |
|
|
|
!ab: "A" "B"? |
|
|
|
!bc: "B"? "C"? |
|
|
|
!cd: "C"? "D" |
|
|
|
!e: "E" |
|
|
|
""" |
|
|
|
|
|
|
|
l = Lark(grammar, parser='earley', ambiguity='explicit', lexer=LEXER) |
|
|
|
ambig_tree = l.parse("ABCDE") |
|
|
|
expected = { |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A', 'B']), |
|
|
|
Tree('bc', ['C']), |
|
|
|
Tree('cd', ['D']), |
|
|
|
Tree('e', ['E']) |
|
|
|
]), |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A']), |
|
|
|
Tree('bc', ['B', 'C']), |
|
|
|
Tree('cd', ['D']), |
|
|
|
Tree('e', ['E']) |
|
|
|
]), |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A']), |
|
|
|
Tree('bc', ['B']), |
|
|
|
Tree('cd', ['C', 'D']), |
|
|
|
Tree('e', ['E']) |
|
|
|
]), |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A', 'B']), |
|
|
|
Tree('bc', []), |
|
|
|
Tree('cd', ['C', 'D']), |
|
|
|
Tree('e', ['E']) |
|
|
|
]), |
|
|
|
} |
|
|
|
self.assertEqual(ambig_tree.data, '_ambig') |
|
|
|
self.assertEqual(set(ambig_tree.children), expected) |
|
|
|
|
|
|
|
def test_nested_ambiguous_intermediate_nodes2(self): |
|
|
|
grammar = """ |
|
|
|
start: ab bc cd de f |
|
|
|
!ab: "A" "B"? |
|
|
|
!bc: "B"? "C"? |
|
|
|
!cd: "C"? "D"? |
|
|
|
!de: "D"? "E" |
|
|
|
!f: "F" |
|
|
|
""" |
|
|
|
|
|
|
|
l = Lark(grammar, parser='earley', ambiguity='explicit', lexer=LEXER) |
|
|
|
ambig_tree = l.parse("ABCDEF") |
|
|
|
expected = { |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A', 'B']), |
|
|
|
Tree('bc', ['C']), |
|
|
|
Tree('cd', ['D']), |
|
|
|
Tree('de', ['E']), |
|
|
|
Tree('f', ['F']), |
|
|
|
]), |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A']), |
|
|
|
Tree('bc', ['B', 'C']), |
|
|
|
Tree('cd', ['D']), |
|
|
|
Tree('de', ['E']), |
|
|
|
Tree('f', ['F']), |
|
|
|
]), |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A']), |
|
|
|
Tree('bc', ['B']), |
|
|
|
Tree('cd', ['C', 'D']), |
|
|
|
Tree('de', ['E']), |
|
|
|
Tree('f', ['F']), |
|
|
|
]), |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A']), |
|
|
|
Tree('bc', ['B']), |
|
|
|
Tree('cd', ['C']), |
|
|
|
Tree('de', ['D', 'E']), |
|
|
|
Tree('f', ['F']), |
|
|
|
]), |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A', "B"]), |
|
|
|
Tree('bc', []), |
|
|
|
Tree('cd', ['C']), |
|
|
|
Tree('de', ['D', 'E']), |
|
|
|
Tree('f', ['F']), |
|
|
|
]), |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A']), |
|
|
|
Tree('bc', ['B', 'C']), |
|
|
|
Tree('cd', []), |
|
|
|
Tree('de', ['D', 'E']), |
|
|
|
Tree('f', ['F']), |
|
|
|
]), |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A', 'B']), |
|
|
|
Tree('bc', []), |
|
|
|
Tree('cd', ['C', 'D']), |
|
|
|
Tree('de', ['E']), |
|
|
|
Tree('f', ['F']), |
|
|
|
]), |
|
|
|
Tree('start', [ |
|
|
|
Tree('ab', ['A', 'B']), |
|
|
|
Tree('bc', ['C']), |
|
|
|
Tree('cd', []), |
|
|
|
Tree('de', ['D', 'E']), |
|
|
|
Tree('f', ['F']), |
|
|
|
]), |
|
|
|
} |
|
|
|
self.assertEqual(ambig_tree.data, '_ambig') |
|
|
|
self.assertEqual(set(ambig_tree.children), expected) |
|
|
|
|
|
|
|
def test_ambiguous_intermediate_node_unnamed_token(self): |
|
|
|
grammar = """ |
|
|
|
start: ab bc "D" |
|
|
|
!ab: "A" "B"? |
|
|
|
!bc: "B"? "C" |
|
|
|
""" |
|
|
|
|
|
|
|
l = Lark(grammar, parser='earley', ambiguity='explicit', lexer=LEXER) |
|
|
|
ambig_tree = l.parse("ABCD") |
|
|
|
expected = { |
|
|
|
Tree('start', [Tree('ab', ['A']), Tree('bc', ['B', 'C'])]), |
|
|
|
Tree('start', [Tree('ab', ['A', 'B']), Tree('bc', ['C'])]) |
|
|
|
} |
|
|
|
self.assertEqual(ambig_tree.data, '_ambig') |
|
|
|
self.assertEqual(set(ambig_tree.children), expected) |
|
|
|
|
|
|
|
def test_ambiguous_intermediate_node_inlined_rule(self): |
|
|
|
grammar = """ |
|
|
|
start: ab _bc d? |
|
|
|
!ab: "A" "B"? |
|
|
|
_bc: "B"? "C" |
|
|
|
!d: "D" |
|
|
|
""" |
|
|
|
|
|
|
|
l = Lark(grammar, parser='earley', ambiguity='explicit', lexer=LEXER) |
|
|
|
ambig_tree = l.parse("ABCD") |
|
|
|
expected = { |
|
|
|
Tree('start', [Tree('ab', ['A']), Tree('d', ['D'])]), |
|
|
|
Tree('start', [Tree('ab', ['A', 'B']), Tree('d', ['D'])]) |
|
|
|
} |
|
|
|
self.assertEqual(ambig_tree.data, '_ambig') |
|
|
|
self.assertEqual(set(ambig_tree.children), expected) |
|
|
|
|
|
|
|
def test_ambiguous_intermediate_node_conditionally_inlined_rule(self): |
|
|
|
grammar = """ |
|
|
|
start: ab bc d? |
|
|
|
!ab: "A" "B"? |
|
|
|
!?bc: "B"? "C" |
|
|
|
!d: "D" |
|
|
|
""" |
|
|
|
|
|
|
|
l = Lark(grammar, parser='earley', ambiguity='explicit', lexer=LEXER) |
|
|
|
ambig_tree = l.parse("ABCD") |
|
|
|
expected = { |
|
|
|
Tree('start', [Tree('ab', ['A']), Tree('bc', ['B', 'C']), Tree('d', ['D'])]), |
|
|
|
Tree('start', [Tree('ab', ['A', 'B']), 'C', Tree('d', ['D'])]) |
|
|
|
} |
|
|
|
self.assertEqual(ambig_tree.data, '_ambig') |
|
|
|
self.assertEqual(set(ambig_tree.children), expected) |
|
|
|
|
|
|
|
def test_fruitflies_ambig(self): |
|
|
|
grammar = """ |
|
|
|
start: noun verb noun -> simple |
|
|
|