[antlr-interest] Possible bug in generated code

Anakreon Mejdi amejdi at ertonline.gr
Mon Nov 4 07:32:13 PST 2002


Hello antlr users.

I faced a problem with the Parser generated by antlr, and have possibly 
dicovered a bug in the code generated.

 From a rule declared as:
if_rule
   :
   IF^ LPAREN! expression RPAREN! statement
   (
       options {
         warnWhenFollowAmbig = false;
       }
       :
       ELSE! statement
   )?
   ;
wich is copied from java.g the code generated is:

	public final void if_rule() throws RecognitionException, 
TokenStreamException {
		
		returnAST = null;
		ASTPair currentAST = new ASTPair();
		AST if_rule_AST = null;
		
		AST tmp52_AST = null;
		if (inputState.guessing==0) {
			tmp52_AST = (AST)astFactory.create(LT(1));
			astFactory.makeASTRoot(currentAST, tmp52_AST);
		}
		match(IF);
		AST tmp53_AST = null;
		tmp53_AST = (AST)astFactory.create(LT(1));
		match(LPAREN);
		expression();
		if (inputState.guessing==0) {
			astFactory.addASTChild(currentAST, returnAST);
		}
		AST tmp54_AST = null;
		tmp54_AST = (AST)astFactory.create(LT(1));
		match(RPAREN);
		statement();
		if (inputState.guessing==0) {
			astFactory.addASTChild(currentAST, returnAST);
		}
		{
		if ((LA(1)==ELSE) && (_tokenSet_0.member(LA(2)))) {
			AST tmp55_AST = null;
			tmp55_AST = (AST)astFactory.create(LT(1));
			match(ELSE);
			statement();
			if (inputState.guessing==0) {
				astFactory.addASTChild(currentAST, returnAST);
			}
		}
		else if ((_tokenSet_6.member(LA(1))) && (_tokenSet_7.member(LA(2)))) {
		}
		else {
			throw new NoViableAltException(LT(1), getFilename());
		}
		
		}
		if_rule_AST = (AST)currentAST.root;
		returnAST = if_rule_AST;
	}

My objection to this code is that the ELSE part is optional,
so why  does this code:
		else if ((_tokenSet_6.member(LA(1))) && (_tokenSet_7.member(LA(2)))) {
		}
		else {
			throw new NoViableAltException(LT(1), getFilename());
		}
exists?
The parser fails to parse a file when after the "if" part is matched an 
EOF Token follows.

To prove my theory I removed the
else if ((_tokenSet_6.member(LA(1))) && ....
line and indead the parser worked just fine.

My version of antlr is antlr-2.7.1 and jdk1.4.


If this is after all a bug and is fixed in antlr-2.7.2
I apologize for mentioning again.

Thanks in advance.
Anakreon



 

Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ 



More information about the antlr-interest mailing list