xref: /aosp_15_r20/external/antlr/runtime/Python/tests/t056lexer.py (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robotimport unittest
2*16467b97STreehugger Robotimport textwrap
3*16467b97STreehugger Robotimport antlr3
4*16467b97STreehugger Robotimport antlr3.tree
5*16467b97STreehugger Robotimport stringtemplate3
6*16467b97STreehugger Robotimport testbase
7*16467b97STreehugger Robotimport sys
8*16467b97STreehugger Robotimport os
9*16467b97STreehugger Robotfrom StringIO import StringIO
10*16467b97STreehugger Robot
11*16467b97STreehugger Robot# FIXME: port other tests from TestLexer.java
12*16467b97STreehugger Robot
13*16467b97STreehugger Robotclass T(testbase.ANTLRTest):
14*16467b97STreehugger Robot    def execParser(self, grammar, grammarEntry, input):
15*16467b97STreehugger Robot        lexerCls, parserCls = self.compileInlineGrammar(grammar)
16*16467b97STreehugger Robot
17*16467b97STreehugger Robot        cStream = antlr3.StringStream(input)
18*16467b97STreehugger Robot        lexer = lexerCls(cStream)
19*16467b97STreehugger Robot        tStream = antlr3.CommonTokenStream(lexer)
20*16467b97STreehugger Robot        parser = parserCls(tStream)
21*16467b97STreehugger Robot        result = getattr(parser, grammarEntry)()
22*16467b97STreehugger Robot        return result
23*16467b97STreehugger Robot
24*16467b97STreehugger Robot
25*16467b97STreehugger Robot    def testRefToRuleDoesNotSetChannel(self):
26*16467b97STreehugger Robot        # this must set channel of A to HIDDEN.  $channel is local to rule
27*16467b97STreehugger Robot        # like $type.
28*16467b97STreehugger Robot        grammar = textwrap.dedent(
29*16467b97STreehugger Robot            r'''
30*16467b97STreehugger Robot            grammar P;
31*16467b97STreehugger Robot            options {
32*16467b97STreehugger Robot              language=Python;
33*16467b97STreehugger Robot            }
34*16467b97STreehugger Robot            a returns [foo]: A EOF { $foo = '\%s, channel=\%d' \% ($A.text, $A.channel); } ;
35*16467b97STreehugger Robot            A : '-' WS I ;
36*16467b97STreehugger Robot            I : '0'..'9'+ ;
37*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
38*16467b97STreehugger Robot            ''')
39*16467b97STreehugger Robot
40*16467b97STreehugger Robot        found = self.execParser(
41*16467b97STreehugger Robot            grammar, 'a',
42*16467b97STreehugger Robot            "- 34"
43*16467b97STreehugger Robot            )
44*16467b97STreehugger Robot
45*16467b97STreehugger Robot        self.failUnlessEqual("- 34, channel=0", found)
46*16467b97STreehugger Robot
47*16467b97STreehugger Robot
48*16467b97STreehugger Robotif __name__ == '__main__':
49*16467b97STreehugger Robot    unittest.main()
50