xref: /aosp_15_r20/external/antlr/runtime/Python/tests/t047treeparser.py (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robotimport unittest
2*16467b97STreehugger Robotimport textwrap
3*16467b97STreehugger Robotimport antlr3
4*16467b97STreehugger Robotimport antlr3.tree
5*16467b97STreehugger Robotimport testbase
6*16467b97STreehugger Robot
7*16467b97STreehugger Robotclass T(testbase.ANTLRTest):
8*16467b97STreehugger Robot    def walkerClass(self, base):
9*16467b97STreehugger Robot        class TWalker(base):
10*16467b97STreehugger Robot            def __init__(self, *args, **kwargs):
11*16467b97STreehugger Robot                base.__init__(self, *args, **kwargs)
12*16467b97STreehugger Robot
13*16467b97STreehugger Robot                self.traces = []
14*16467b97STreehugger Robot
15*16467b97STreehugger Robot
16*16467b97STreehugger Robot            def traceIn(self, ruleName, ruleIndex):
17*16467b97STreehugger Robot                self.traces.append('>'+ruleName)
18*16467b97STreehugger Robot
19*16467b97STreehugger Robot
20*16467b97STreehugger Robot            def traceOut(self, ruleName, ruleIndex):
21*16467b97STreehugger Robot                self.traces.append('<'+ruleName)
22*16467b97STreehugger Robot
23*16467b97STreehugger Robot
24*16467b97STreehugger Robot            def recover(self, input, re):
25*16467b97STreehugger Robot                # no error recovery yet, just crash!
26*16467b97STreehugger Robot                raise
27*16467b97STreehugger Robot
28*16467b97STreehugger Robot        return TWalker
29*16467b97STreehugger Robot
30*16467b97STreehugger Robot
31*16467b97STreehugger Robot    def setUp(self):
32*16467b97STreehugger Robot        self.compileGrammar()
33*16467b97STreehugger Robot        self.compileGrammar('t047treeparserWalker.g', options='-trace')
34*16467b97STreehugger Robot
35*16467b97STreehugger Robot
36*16467b97STreehugger Robot    def testWalker(self):
37*16467b97STreehugger Robot        input = textwrap.dedent(
38*16467b97STreehugger Robot            '''\
39*16467b97STreehugger Robot            char c;
40*16467b97STreehugger Robot            int x;
41*16467b97STreehugger Robot
42*16467b97STreehugger Robot            void bar(int x);
43*16467b97STreehugger Robot
44*16467b97STreehugger Robot            int foo(int y, char d) {
45*16467b97STreehugger Robot              int i;
46*16467b97STreehugger Robot              for (i=0; i<3; i=i+1) {
47*16467b97STreehugger Robot                x=3;
48*16467b97STreehugger Robot                y=5;
49*16467b97STreehugger Robot              }
50*16467b97STreehugger Robot            }
51*16467b97STreehugger Robot            ''')
52*16467b97STreehugger Robot
53*16467b97STreehugger Robot        cStream = antlr3.StringStream(input)
54*16467b97STreehugger Robot        lexer = self.getLexer(cStream)
55*16467b97STreehugger Robot        tStream = antlr3.CommonTokenStream(lexer)
56*16467b97STreehugger Robot        parser = self.getParser(tStream)
57*16467b97STreehugger Robot        r = parser.program()
58*16467b97STreehugger Robot
59*16467b97STreehugger Robot        self.failUnlessEqual(
60*16467b97STreehugger Robot            r.tree.toStringTree(),
61*16467b97STreehugger Robot            "(VAR_DEF char c) (VAR_DEF int x) (FUNC_DECL (FUNC_HDR void bar (ARG_DEF int x))) (FUNC_DEF (FUNC_HDR int foo (ARG_DEF int y) (ARG_DEF char d)) (BLOCK (VAR_DEF int i) (for (= i 0) (< i 3) (= i (+ i 1)) (BLOCK (= x 3) (= y 5)))))"
62*16467b97STreehugger Robot            )
63*16467b97STreehugger Robot
64*16467b97STreehugger Robot        nodes = antlr3.tree.CommonTreeNodeStream(r.tree)
65*16467b97STreehugger Robot        nodes.setTokenStream(tStream)
66*16467b97STreehugger Robot        walker = self.getWalker(nodes)
67*16467b97STreehugger Robot        walker.program()
68*16467b97STreehugger Robot
69*16467b97STreehugger Robot        # FIXME: need to crosscheck with Java target (compile walker with
70*16467b97STreehugger Robot        # -trace option), if this is the real list. For now I'm happy that
71*16467b97STreehugger Robot        # it does not crash ;)
72*16467b97STreehugger Robot        self.failUnlessEqual(
73*16467b97STreehugger Robot            walker.traces,
74*16467b97STreehugger Robot            [ '>program', '>declaration', '>variable', '>type', '<type',
75*16467b97STreehugger Robot              '>declarator', '<declarator', '<variable', '<declaration',
76*16467b97STreehugger Robot              '>declaration', '>variable', '>type', '<type', '>declarator',
77*16467b97STreehugger Robot              '<declarator', '<variable', '<declaration', '>declaration',
78*16467b97STreehugger Robot              '>functionHeader', '>type', '<type', '>formalParameter',
79*16467b97STreehugger Robot              '>type', '<type', '>declarator', '<declarator',
80*16467b97STreehugger Robot              '<formalParameter', '<functionHeader', '<declaration',
81*16467b97STreehugger Robot              '>declaration', '>functionHeader', '>type', '<type',
82*16467b97STreehugger Robot              '>formalParameter', '>type', '<type', '>declarator',
83*16467b97STreehugger Robot              '<declarator', '<formalParameter', '>formalParameter', '>type',
84*16467b97STreehugger Robot              '<type', '>declarator', '<declarator', '<formalParameter',
85*16467b97STreehugger Robot              '<functionHeader', '>block', '>variable', '>type', '<type',
86*16467b97STreehugger Robot              '>declarator', '<declarator', '<variable', '>stat', '>forStat',
87*16467b97STreehugger Robot              '>expr', '>expr', '>atom', '<atom', '<expr', '<expr', '>expr',
88*16467b97STreehugger Robot              '>expr', '>atom', '<atom', '<expr', '>expr', '>atom', '<atom',
89*16467b97STreehugger Robot              '<expr', '<expr', '>expr', '>expr', '>expr', '>atom', '<atom',
90*16467b97STreehugger Robot              '<expr', '>expr', '>atom', '<atom', '<expr', '<expr', '<expr',
91*16467b97STreehugger Robot              '>block', '>stat', '>expr', '>expr', '>atom', '<atom', '<expr',
92*16467b97STreehugger Robot              '<expr', '<stat', '>stat', '>expr', '>expr', '>atom', '<atom',
93*16467b97STreehugger Robot              '<expr', '<expr', '<stat', '<block', '<forStat', '<stat',
94*16467b97STreehugger Robot              '<block', '<declaration', '<program'
95*16467b97STreehugger Robot              ]
96*16467b97STreehugger Robot            )
97*16467b97STreehugger Robot
98*16467b97STreehugger Robot    def testRuleLabelPropertyRefText(self):
99*16467b97STreehugger Robot        self.compileGrammar()
100*16467b97STreehugger Robot        self.compileGrammar('t047treeparserWalker.g', options='-trace')
101*16467b97STreehugger Robot
102*16467b97STreehugger Robot        input = textwrap.dedent(
103*16467b97STreehugger Robot            '''\
104*16467b97STreehugger Robot            char c;
105*16467b97STreehugger Robot            ''')
106*16467b97STreehugger Robot
107*16467b97STreehugger Robot        cStream = antlr3.StringStream(input)
108*16467b97STreehugger Robot        lexer = self.getLexer(cStream)
109*16467b97STreehugger Robot        tStream = antlr3.CommonTokenStream(lexer)
110*16467b97STreehugger Robot        parser = self.getParser(tStream)
111*16467b97STreehugger Robot        r = parser.variable()
112*16467b97STreehugger Robot
113*16467b97STreehugger Robot        nodes = antlr3.tree.CommonTreeNodeStream(r.tree)
114*16467b97STreehugger Robot        nodes.setTokenStream(tStream)
115*16467b97STreehugger Robot        walker = self.getWalker(nodes)
116*16467b97STreehugger Robot        r = walker.variable()
117*16467b97STreehugger Robot
118*16467b97STreehugger Robot        self.failUnlessEqual(r, 'c')
119*16467b97STreehugger Robot
120*16467b97STreehugger Robot
121*16467b97STreehugger Robotif __name__ == '__main__':
122*16467b97STreehugger Robot    unittest.main()
123