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