1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport unittest
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport textwrap
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3.tree
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport testbase
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport sys
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass T(testbase.ANTLRTest):
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def parserClass(self, base):
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class TParser(base):
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def __init__(self, *args, **kwargs):
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                base.__init__(self, *args, **kwargs)
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._output = ""
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._output += t
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def traceIn(self, ruleName, ruleIndex):
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.traces.append('>'+ruleName)
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def traceOut(self, ruleName, ruleIndex):
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.traces.append('<'+ruleName)
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def recover(self, input, re):
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                # no error recovery yet, just crash!
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                raise
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return TParser
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def lexerClass(self, base):
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class TLexer(base):
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def __init__(self, *args, **kwargs):
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                base.__init__(self, *args, **kwargs)
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._output = ""
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._output += t
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def traceIn(self, ruleName, ruleIndex):
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.traces.append('>'+ruleName)
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def traceOut(self, ruleName, ruleIndex):
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.traces.append('<'+ruleName)
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def recover(self, input, re):
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                # no error recovery yet, just crash!
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                raise
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return TLexer
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def execParser(self, grammar, grammarEntry, input):
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexerCls, parserCls = self.compileInlineGrammar(grammar)
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        cStream = antlr3.StringStream(input)
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = lexerCls(cStream)
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tStream = antlr3.CommonTokenStream(lexer)
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = parserCls(tStream)
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r = getattr(parser, grammarEntry)()
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if r is not None:
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return r.tree.toStringTree()
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return ""
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def execTreeParser(self, grammar, grammarEntry, treeGrammar, treeEntry, input):
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexerCls, parserCls = self.compileInlineGrammar(grammar)
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        walkerCls = self.compileInlineGrammar(treeGrammar)
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        cStream = antlr3.StringStream(input)
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = lexerCls(cStream)
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tStream = antlr3.CommonTokenStream(lexer)
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = parserCls(tStream)
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r = getattr(parser, grammarEntry)()
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        nodes = antlr3.tree.CommonTreeNodeStream(r.tree)
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        nodes.setTokenStream(tStream)
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        walker = walkerCls(nodes)
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r = getattr(walker, treeEntry)()
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if r is not None:
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return r.tree.toStringTree()
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return ""
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    # PARSERS -- AUTO AST
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testToken(self):
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T1;
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return self.token.text + "<V>"
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID<V> ;
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="a"
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("a<V>", found)
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTokenCommonTree(self):
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                output=AST;
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID<CommonTree> ;
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="a")
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("a", found)
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTokenWithQualifiedType(self):
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                output=AST;
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @members {
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            class V(CommonTree):
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                def toString(self):
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return self.token.text + "<V>"
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                __str__ = toString
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID<TParser.V> ; // TParser.V is qualified name
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="a"
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("a<V>", found)
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNamedType(self):
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r"""
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar $T;
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                output=AST;
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @header {
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            class V(CommonTree):
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                def toString(self):
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return self.token.text + "<V>"
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                __str__ = toString
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID<node=V> ;
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\\n') {$channel=HIDDEN;} ;
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            """)
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, 'a', input="a")
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("a<V>", found)
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTokenWithLabel(self):
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T2;
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return self.token.text + "<V>"
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : x=ID<V> ;
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="a"
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("a<V>", found)
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTokenWithListLabel(self):
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T3;
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return self.token.text + "<V>"
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : x+=ID<V> ;
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="a"
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("a<V>", found)
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTokenRoot(self):
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T4;
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return self.token.text + "<V>"
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID<V>^ ;
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="a"
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("a<V>", found)
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTokenRootWithListLabel(self):
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T5;
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return self.token.text + "<V>"
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : x+=ID<V>^ ;
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="a"
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("a<V>", found)
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testString(self):
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T6;
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return self.token.text + "<V>"
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : 'begin'<V> ;
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="begin"
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("begin<V>", found)
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testStringRoot(self):
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T7;
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return self.token.text + "<V>"
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : 'begin'<V>^ ;
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="begin"
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("begin<V>", found)
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    # PARSERS -- REWRITE AST
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRewriteToken(self):
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T8;
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return self.token.text + "<V>"
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID -> ID<V> ;
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="a"
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("a<V>", found)
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRewriteTokenWithArgs(self):
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T9;
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def __init__(self, *args):
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if len(args) == 4:
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    ttype = args[0]
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    x = args[1]
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    y = args[2]
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    z = args[3]
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    token = CommonToken(type=ttype, text="")
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                elif len(args) == 3:
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    ttype = args[0]
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    token = args[1]
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    x = args[2]
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    y, z = 0, 0
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                else:
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    raise TypeError("Invalid args \%r" \% (args,))
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                CommonTree.__init__(self, token)
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.x = x
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.y = y
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.z = z
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                txt = ""
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if self.token is not None:
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    txt += self.token.text
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                txt +="<V>;\%d\%d\%d" \% (self.x, self.y, self.z)
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return txt
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID -> ID<V>[42,19,30] ID<V>[$ID,99];
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="a"
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("<V>;421930 a<V>;9900", found)
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRewriteTokenRoot(self):
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T10;
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return self.token.text + "<V>"
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID INT -> ^(ID<V> INT) ;
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INT : '0'..'9'+ ;
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="a 2"
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("(a<V> 2)", found)
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRewriteString(self):
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T11;
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return self.token.text + "<V>"
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : 'begin' -> 'begin'<V> ;
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="begin"
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("begin<V>", found)
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRewriteStringRoot(self):
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T12;
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return self.token.text + "<V>"
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : 'begin' INT -> ^('begin'<V> INT) ;
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INT : '0'..'9'+ ;
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="begin 2"
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("(begin<V> 2)", found)
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRewriteRuleResults(self):
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                output=AST;
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens {LIST;}
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @header {
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            class V(CommonTree):
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                def toString(self):
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return self.token.text + "<V>"
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                __str__ = toString
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            class W(CommonTree):
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                def __init__(self, tokenType, txt):
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    super(W, self).__init__(
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        CommonToken(type=tokenType, text=txt))
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                def toString(self):
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return self.token.text + "<W>"
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                __str__ = toString
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : id (',' id)* -> ^(LIST<W>["LIST"] id+);
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            id : ID -> ID<V>;
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="a,b,c")
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("(LIST<W> a<V> b<V> c<V>)", found)
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testCopySemanticsWithHetero(self):
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                output=AST;
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @header {
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            class V(CommonTree):
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                def dupNode(self):
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return V(self)
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                def toString(self):
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return self.token.text + "<V>"
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                __str__ = toString
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : type ID (',' ID)* ';' -> ^(type ID)+;
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            type : 'int'<V> ;
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\\n') {$channel=HIDDEN;} ;
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="int a, b, c;")
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("(int<V> a) (int<V> b) (int<V> c)", found)
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    # TREE PARSERS -- REWRITE AST
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTreeParserRewriteFlatList(self):
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T13;
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID INT;
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INT : '0'..'9'+;
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree grammar TP13;
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ASTLabelType=CommonTree;
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenVocab=T13;
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return self.token.text + "<V>"
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class W(CommonTree):
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return self.token.text + "<W>"
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID INT -> INT<V> ID<W>
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ;
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="abc 34"
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("34<V> abc<W>", found)
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTreeParserRewriteTree(self):
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T14;
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID INT;
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INT : '0'..'9'+;
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree grammar TP14;
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ASTLabelType=CommonTree;
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenVocab=T14;
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return self.token.text + "<V>"
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class W(CommonTree):
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return self.token.text + "<W>"
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID INT -> ^(INT<V> ID<W>)
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ;
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="abc 34"
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("(34<V> abc<W>)", found)
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTreeParserRewriteImaginary(self):
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T15;
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID ;
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INT : '0'..'9'+;
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree grammar TP15;
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ASTLabelType=CommonTree;
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenVocab=T15;
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens { ROOT; }
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def __init__(self, tokenType):
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                CommonTree.__init__(self, CommonToken(tokenType))
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return tokenNames[self.token.type] + "<V>"
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID -> ROOT<V> ID
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ;
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="abc"
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("ROOT<V> abc", found)
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTreeParserRewriteImaginaryWithArgs(self):
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T16;
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID ;
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INT : '0'..'9'+;
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree grammar TP16;
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ASTLabelType=CommonTree;
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenVocab=T16;
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens { ROOT; }
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def __init__(self, tokenType, x):
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                CommonTree.__init__(self, CommonToken(tokenType))
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.x = x
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return tokenNames[self.token.type] + "<V>;" + str(self.x)
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID -> ROOT<V>[42] ID
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ;
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="abc"
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("ROOT<V>;42 abc", found)
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTreeParserRewriteImaginaryRoot(self):
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T17;
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID ;
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INT : '0'..'9'+;
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree grammar TP17;
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ASTLabelType=CommonTree;
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenVocab=T17;
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens { ROOT; }
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def __init__(self, tokenType):
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                CommonTree.__init__(self, CommonToken(tokenType))
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return tokenNames[self.token.type] + "<V>"
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID -> ^(ROOT<V> ID)
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ;
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="abc"
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("(ROOT<V> abc)", found)
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTreeParserRewriteImaginaryFromReal(self):
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar T18;
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID ;
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INT : '0'..'9'+;
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree grammar TP18;
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ASTLabelType=CommonTree;
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenVocab=T18;
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens { ROOT; }
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @header {
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def __init__(self, tokenType, tree=None):
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if tree is None:
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    CommonTree.__init__(self, CommonToken(tokenType))
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                else:
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    CommonTree.__init__(self, tree)
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.token.type = tokenType
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def toString(self):
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return tokenNames[self.token.type]+"<V>@"+str(self.token.line)
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            __str__ = toString
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID -> ROOT<V>[$ID]
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ;
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="abc"
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("ROOT<V>@1", found)
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTreeParserAutoHeteroAST(self):
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                output=AST;
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID ';' ;
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tree grammar TP;
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                output=AST;
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ASTLabelType=CommonTree;
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                tokenVocab=T;
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens { ROOT; }
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @header {
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            class V(CommonTree):
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                def toString(self):
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return CommonTree.toString(self) + "<V>"
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                __str__ = toString
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID<V> ';'<V>;
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="abc;"
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("abc<V> ;<V>", found)
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __name__ == '__main__':
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    unittest.main()
940