1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport unittest
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport textwrap
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3.tree
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport stringtemplate3
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport testbase
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport sys
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport os
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom StringIO import StringIO
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# FIXME: port other tests from TestLexer.java
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass T(testbase.ANTLRTest):
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def execParser(self, grammar, grammarEntry, input):
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexerCls, parserCls = self.compileInlineGrammar(grammar)
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        cStream = antlr3.StringStream(input)
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = lexerCls(cStream)
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tStream = antlr3.CommonTokenStream(lexer)
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = parserCls(tStream)
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = getattr(parser, grammarEntry)()
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return result
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRefToRuleDoesNotSetChannel(self):
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # this must set channel of A to HIDDEN.  $channel is local to rule
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # like $type.
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar P;
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              language=Python;
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a returns [foo]: A EOF { $foo = '\%s, channel=\%d' \% ($A.text, $A.channel); } ;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            A : '-' WS I ;
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            I : '0'..'9'+ ;
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "- 34"
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("- 34, channel=0", found)
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __name__ == '__main__':
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    unittest.main()
50