[antlr-interest] V3 BUG in C# generator (3.0b5)

Bill Mayfield antlr at telenet.be
Sat Dec 16 12:00:52 PST 2006


Howdy,

Sorry if this isn't the right place to report bugs but I don't know 
where else to go with it so...

Following rule in the 5 minute introduction sample grammar ( 
http://www.antlr.org/wiki/display/ANTLR3/Five+minute+introduction+to+ANTLR+3 
) produces this C# error upon compilation.


Rule: WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+     { channel 
= 99; } ;
Compilation Error: The name channel does not exist in the current context.



I guess channel = 99 should be _channel=99? But is this a bug in the C# 
generator or in the grammer?







Below is the generated code for clarity:




    // $ANTLR start WHITESPACE
    public void mWHITESPACE() // throws RecognitionException [2]
    {
        try
        {
            ruleNestingLevel++;
            int _type = WHITESPACE;
            int _start = CharIndex;
            int _line = Line;
            int _charPosition = CharPositionInLine;
            int _channel = Token.DEFAULT_CHANNEL;
            // c:\\antlr\\work\\simplecalc\\SimpleCalc.g:46:14: ( ( 
('\\t'|' '|'\\r'|'\\n'|'\\u000C'))+ )
            // c:\\antlr\\work\\simplecalc\\SimpleCalc.g:46:14: ( 
('\\t'|' '|'\\r'|'\\n'|'\\u000C'))+
            {
                // c:\\antlr\\work\\simplecalc\\SimpleCalc.g:46:14: ( 
('\\t'|' '|'\\r'|'\\n'|'\\u000C'))+
                int cnt2 = 0;
                do
                {
                    int alt2 = 2;
                    int LA2_0 = input.LA(1);
                    if ( ((LA2_0 >= '\t' && LA2_0 <= '\n') || (LA2_0 >= 
'\f' && LA2_0 <= '\r') || LA2_0 == ' ') )
                    {
                        alt2 = 1;
                    }
                   
               
                    switch (alt2)
                    {
                        case 1 :
                            // 
c:\\antlr\\work\\simplecalc\\SimpleCalc.g:46:16: ('\\t'|' 
'|'\\r'|'\\n'|'\\u000C')
                            {
                                if ( (input.LA(1) >= '\t' && input.LA(1) 
<= '\n') || (input.LA(1) >= '\f' && input.LA(1) <= '\r') || input.LA(1) 
== ' ' )
                                {
                                    input.Consume();
                               
                                }
                                else
                                {
                                    MismatchedSetException mse =
                                        new 
MismatchedSetException(null,input);
                                    Recover(mse);    throw mse;
                                }

                           
                            }
                            break;
               
                        default:
                            if ( cnt2 >= 1 ) goto loop2;
                                EarlyExitException eee =
                                    new EarlyExitException(2, input);
                                throw eee;
                    }
                    cnt2++;
                } while (true);
               
                loop2:
                    ;    // Stops C# compiler whinging that label 
'loop2' has no statements

                 channel = 99;
           
            }
   
   
           
                    if ( (token == null) && (ruleNestingLevel == 1) )
                    {
                        Emit(_type, _line, _charPosition, _channel, 
_start, CharIndex-1);
                    }
           
                        }
        finally
        {
            ruleNestingLevel--;
        }
    }
    // $ANTLR end WHITESPACE


More information about the antlr-interest mailing list