コード例 #1
0
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))
コード例 #2
0
    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)
コード例 #3
0
    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)
コード例 #4
0
    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)
コード例 #5
0
 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)
コード例 #6
0
    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)
コード例 #7
0
    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)
コード例 #8
0
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))
コード例 #9
0
    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)
コード例 #10
0
    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)
コード例 #11
0
    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)
コード例 #12
0
ファイル: slr1.py プロジェクト: curtisxk38/compiler-stuff
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))
コード例 #13
0
    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)
コード例 #14
0
    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)
コード例 #15
0
def main():
    g = grammar.make_dummy_grammar("test.json")
    first = get_first(g)
    print(first)
    follow = get_follow(g, first)
    print(follow)