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))
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])
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])
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)))
def test_new_label(self): rule = Rule('S', ('4', '3')) label = Label([Item(rule), Item(rule, 1)])
def test_shift_all_end(self): Sym = self.Sym1 self.assertEqual( Label(), shift_all(self.small_label(Sym.HEAD, (Sym.A,), 1), Sym.A))
def test_shift_all_mismatch(self): Sym = self.Sym1 self.assertEqual( Label(), shift_all(self.small_label(Sym.HEAD, (Sym.A,), 0), Sym.B))
def small_label(self, head, children, place): return Label([Item(Rule(head, children), place)])
def test_lookup_miss(self): graph = self.small_state_graph() with self.assertRaises(KeyError): graph.lookup(Label('b'))
def test_lookup(self): graph = self.small_state_graph() self.assertEqual(0, graph.lookup(Label('a')))
def small_state_graph(self, label=Label('a')): graph = StateGraph() graph._states.append((label, {})) return graph