Browse Source

Write tests for ambiguous intermediate nodes in the SPPF

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.10.0
Chanic Panic 4 years ago
parent
commit
f89b1549dd
1 changed files with 215 additions and 0 deletions
  1. +215
    -0
      tests/test_parser.py

+ 215
- 0
tests/test_parser.py View File

@@ -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


Loading…
Cancel
Save