def main(): import scanner g = grammar.make_dummy_grammar("test_input/test2.cfg") parse_table = construct_parse_table(g) tokens = scanner.dummy_tokenize("aab$") ast_root = parse(parse_table, g, tokens) print(ast.gen_ast_digraph(ast_root))
def test_follow2(self): expected = {'S': set('$'), 'A': set('$'), 'B': set('b'), 'C': set('d')} g = grammar.make_dummy_grammar("test_input/test2.cfg") first = first_follow.get_first(g) got = first_follow.get_follow(g, first) self.assertEqual(expected, got)
def test_follow1(self): expected = {'A': set('$'), 'D': set(['$', 'e']), 'E': set("$")} g = grammar.make_dummy_grammar("test_input/test1.cfg") first = first_follow.get_first(g) got = first_follow.get_follow(g, first) self.assertEqual(expected, got)
def test_first_of_string2(self): g = grammar.make_dummy_grammar("test_input/test1.cfg") first = first_follow.get_first(g) input_str = ["D", "E", "D"] expected = set(["d", "e", ""]) got = first_follow.first_of_string(first, input_str) self.assertEqual(got, expected)
def test_ll1(self): g = grammar.make_dummy_grammar("test_input/test2.cfg") expected = [ [g.rules[0], g.rules[0], g.rules[0], g.rules[0], None], [g.rules[1], g.rules[1], g.rules[2], g.rules[2], g.rules[2]], [g.rules[3], g.rules[4], None, None, None], [None, None, g.rules[5], g.rules[6], None] ] self.assertEqual(ll1.construct_parse_table(g), expected)
def test_clos1(self): g = grammar.make_dummy_grammar("test_input/test3.cfg") kernel = slr1.LR0Item(g.rules[0],0) closure = slr1.closure(set([kernel]), g, None) expected = set([kernel, slr1.LR0Item(g.rules[1], 0), slr1.LR0Item(g.rules[2], 0)]) self.assertEqual(closure, expected)
def test_not_slr1_grammar(self): g = grammar.make_dummy_grammar("test_input/test4.cfg") lr_parse_common.augment_grammar(g) first = first_follow.get_first(g) follow = first_follow.get_follow(g, first) kernel = slr1.LR0Item(g.rules[-1], 0) dfa = lr_parse_common.make_dfa(g, slr1.closure, kernel, first) with self.assertRaises(lr_parse_common.ShiftReduceError): action, goto_table = slr1.make_parse_table(dfa, follow, g)
def main(): import scanner g = grammar.make_dummy_grammar("test_input/test4.cfg") lr_parse_common.augment_grammar(g) kernel = LR1Item(g.rules[-1], 0, "$") first_set = first_follow.get_first(g) follow = first_follow.get_follow(g, first_set) dfa = lr_parse_common.make_dfa(g, closure, kernel, first_set) print(dfa.generate_dot_file()) action, goto = make_parse_table(dfa, follow, g) tokens = scanner.dummy_tokenize("i=*i$") ast_root = lr_parse_common.parse(dfa, action, goto, tokens, g) print(ast.gen_ast_digraph(ast_root))
def test_first1(self): expected = { 'A': set(['b']), 'D': set(['', 'd']), 'E': set(['', 'e']), 'b': set(['b']), 'd': set(['d']), 'e': set(['e']), '': set(['']), "$": set(["$"]) } got = first_follow.get_first( grammar.make_dummy_grammar("test_input/test1.cfg")) self.assertEqual(got, expected)
def test_goto1(self): g = grammar.make_dummy_grammar("test_input/test3.cfg") kernel = slr1.LR0Item(g.rules[0],0) items = slr1.closure(set([kernel]), g, None) new_items = lr_parse_common.goto(slr1.closure, items, "(", g, None) expected = set([ slr1.LR0Item(g.rules[1],1), slr1.LR0Item(g.rules[4],0), slr1.LR0Item(g.rules[3],0), slr1.LR0Item(g.rules[1],0), slr1.LR0Item(g.rules[2],0), ]) self.assertEqual(new_items, expected)
def test_first2(self): expected = { 'S': set(['c', 'b', 'd', 'a']), 'A': set(['c', 'b', 'd', 'a']), 'B': set(['', 'a']), 'C': set(['', 'c']), 'a': set(['a']), 'b': set(['b']), 'c': set(['c']), 'd': set(['d']), '': set(['']), "$": set(["$"]) } got = first_follow.get_first( grammar.make_dummy_grammar("test_input/test2.cfg")) self.assertEqual(got, expected)
def main(): import scanner g = grammar.make_dummy_grammar("test_input/test3.cfg") lr_parse_common.augment_grammar(g) first = first_follow.get_first(g) follow = first_follow.get_follow(g, first) # the kernel is the new rule just added (by augmenting) with the dist marker at the beginning kernel = LR0Item(g.rules[-1], 0) dfa = lr_parse_common.make_dfa(g, closure, kernel, first) print(dfa.generate_dot_file()) action, goto_table = make_parse_table(dfa, follow, g) print(action) print(goto_table) tokens = scanner.dummy_tokenize("(a(a((a))))$") ast_root = lr_parse_common.parse(dfa, action, goto_table, tokens, g) print(ast.gen_ast_digraph(ast_root))
def test_clos1(self): g = grammar.make_dummy_grammar("test_input/test5.cfg") lr_parse_common.augment_grammar(g) kernel = set() initial = LR1Item(g.rules[-1], 0, "$") kernel.add(initial) first_set = first_follow.get_first(g) closure(kernel, g, first_set) expected = set([ initial, LR1Item(g.rules[0], 0, "$"), LR1Item(g.rules[1], 0, "d"), LR1Item(g.rules[1], 0, "c"), LR1Item(g.rules[2], 0, "d"), LR1Item(g.rules[2], 0, "c") ]) self.assertEqual(kernel, expected)
def test_make_table(self): g = grammar.make_dummy_grammar("test_input/test3.cfg") lr_parse_common.augment_grammar(g) first = first_follow.get_first(g) follow = first_follow.get_follow(g, first) kernel = slr1.LR0Item(g.rules[-1], 0) dfa = lr_parse_common.make_dfa(g, slr1.closure, kernel, first) action, goto_table = slr1.make_parse_table(dfa, follow, g) expected_action = [ ['s3', 's4', None, None], [None, None, None, 'accept'], [None, None, None, 'r0'], ['r2', 'r2', 'r2', 'r2'], ['s3', 's4', None, None], ['s3', 's4', 'r4', None], [None, None, 's8', None], [None, None, 'r3', None], ['r1', 'r1', 'r1', 'r1'] ] self.assertEqual(expected_action, action) expected_goto = [ [1, 2, None, None], [None, None, None, None], [None, None, None, None], [None, None, None, None], [None, 5, 6, None], [None, 5, 7, None], [None, None, None, None], [None, None, None, None], [None, None, None, None] ] self.assertEqual(expected_goto, goto_table)
def main(): g = grammar.make_dummy_grammar("test.json") first = get_first(g) print(first) follow = get_follow(g, first) print(follow)