[antlr-interest] Why does ANTLR generate code that will never call	an OR'd alternative?
    Avid Trober 
    avidtrober at gmail.com
       
    Fri Aug 20 23:01:20 PDT 2010
    
    
  
For this rule,
 
identifier 
                :       isToken | IDENTIFIER;
 
ANTLR generates code that would never calls the isToken rule
(target=CSharp2):
 
    public MYParser.identifier_return identifier()    // throws
RecognitionException [1]
    {   
.
            // .  : ( isToken | IDENTIFIER )
            int alt30 = 2;
            int LA30_0 = input.LA(1);
 
            if ( (LA30_0 == IDENTIFIER) )   // <== token must be IDENTIFIER
to call isToken???
            {
                int LA30_1 = input.LA(2);
 
                if ( ((isToken(input.LT(1)))) )  // <== why must LA30_0 ==
IDENTIFIER to call isToken?
                {
                    alt30 = 1;
                }
                else if ( (true) )
                {
                    alt30 = 2;
                }
.
            else                         //  <== since not IDENTIFIER, why
not call isToken here???
            {
                NoViableAltException nvae_d30s0 =
                    new NoViableAltException("", 30, 0, input);
 
                throw nvae_d30s0;
            }
 
I would think it's something to do with DFA optimization?   Perhaps that's
why IDENTIFIER is checked first.
But, if IDENTIFIER is false, why not call isToken???    Afterall, the rule
is IDENTIFIER  ****OR***** isToken.
 
Thanks,
Trober
 
 
    
    
More information about the antlr-interest
mailing list