Пример #1
0
 def test_shift_all(self):
     Sym = self.Sym1
     rule = Rule(Sym.HEAD, (Sym.A, Sym.B))
     items = (
         Item(Rule(Sym.HEAD, (Sym.A,)), 1),
         Item(Rule(Sym.HEAD, (Sym.A, Sym.B)), 1),
         Item(Rule(Sym.HEAD, (Sym.A, Sym.A)), 1),
         )
     expect_items = (
         Item(Rule(Sym.HEAD, (Sym.A, Sym.A)), 2),
         )
     self.assertEqual(
         Label(expect_items),
         shift_all(Label(items), Sym.A))
Пример #2
0
 def test_insert_starting_state(self):
     graph = StateGraph()
     Sym = self.StartEnd
     rule = make_imaginary_rule(Sym, Sym.START)
     insert_starting_state(graph, rule, [])
     self.assertEqual(1, len(graph._states))
     self.assertEqual((Label([Item(rule)]), {}), graph._states[0])
Пример #3
0
 def test_add_reduce_operations(self):
     Symbols = self.Symbols
     rule = Rule(Symbols.START, (Symbols.MIDDLE,))
     table = ActionTable()
     graph = StateGraph()
     graph._states.append((Label.from_rule(rule, 1), {}))
     data = SymbolData()
     data[Symbols.START].follow_set.add(Symbols.END)
     add_reduce_operations(table, graph, data)
     self.assertEqual(Action('reduce', rule), table[0, Symbols.END])
Пример #4
0
 def test_fill_kernal_label(self):
     Sym = self.Sym1
     rules = (
         Rule(Sym.HEAD, (Sym.A, Sym.B)),
         Rule(Sym.A, (Sym.A, Sym.B)),
         Rule(Sym.B, (Sym.X, Sym.Y)),
         Rule(Sym.X, (Sym.x,)),
         Rule(Sym.Y, (Sym.y, Sym.y)),
         Rule(Sym.B, ()),
         )
     items = (
         Item(Rule(Sym.HEAD, (Sym.A, Sym.B)), 1),
         Item(Rule(Sym.HEAD, (Sym.A, Sym.c)), 1),
         )
     expect_item = (
         Item(Rule(Sym.HEAD, (Sym.A, Sym.c)), 1),
         Item(rules[0], 1),
         Item(rules[2]),
         Item(rules[3]),
         Item(rules[5]),
         )
     self.assertEqual(
         Label(expect_item), fill_kernal_label(rules, Label(items)))
Пример #5
0
 def test_new_label(self):
     rule = Rule('S', ('4', '3'))
     label = Label([Item(rule), Item(rule, 1)])
Пример #6
0
 def test_shift_all_end(self):
     Sym = self.Sym1
     self.assertEqual(
         Label(),
         shift_all(self.small_label(Sym.HEAD, (Sym.A,), 1), Sym.A))
Пример #7
0
 def test_shift_all_mismatch(self):
     Sym = self.Sym1
     self.assertEqual(
         Label(),
         shift_all(self.small_label(Sym.HEAD, (Sym.A,), 0), Sym.B))
Пример #8
0
 def small_label(self, head, children, place):
     return Label([Item(Rule(head, children), place)])
Пример #9
0
 def test_lookup_miss(self):
     graph = self.small_state_graph()
     with self.assertRaises(KeyError):
         graph.lookup(Label('b'))
Пример #10
0
 def test_lookup(self):
     graph = self.small_state_graph()
     self.assertEqual(0, graph.lookup(Label('a')))
Пример #11
0
 def small_state_graph(self, label=Label('a')):
     graph = StateGraph()
     graph._states.append((label, {}))
     return graph