普通文本  |  50行  |  1.28 KB

import unittest
import textwrap
import antlr3
import antlr3.tree
import stringtemplate3
import testbase
import sys
import os
from StringIO import StringIO

# FIXME: port other tests from TestLexer.java

class T(testbase.ANTLRTest):
    def execParser(self, grammar, grammarEntry, input):
        lexerCls, parserCls = self.compileInlineGrammar(grammar)

        cStream = antlr3.StringStream(input)
        lexer = lexerCls(cStream)
        tStream = antlr3.CommonTokenStream(lexer)
        parser = parserCls(tStream)
        result = getattr(parser, grammarEntry)()
        return result
    

    def testRefToRuleDoesNotSetChannel(self):
        # this must set channel of A to HIDDEN.  $channel is local to rule
        # like $type.
        grammar = textwrap.dedent(
            r'''
            grammar P;
            options {
              language=Python;
            }
            a returns [foo]: A EOF { $foo = '\%s, channel=\%d' \% ($A.text, $A.channel); } ;
            A : '-' WS I ;
            I : '0'..'9'+ ;
            WS : (' '|'\n') {$channel=HIDDEN;} ;
            ''')
        
        found = self.execParser(
            grammar, 'a',
            "- 34"
            )

        self.failUnlessEqual("- 34, channel=0", found)

        
if __name__ == '__main__':
    unittest.main()