[antlr-interest] nondeterminism problem

=?gb2312?q?=CB=EF=BC=CD=B8=D5=20Jigang=20(Robert)=20Sun?= sunjigang1965 at yahoo.com.cn
Sat Feb 25 05:13:56 PST 2006


Error occurs when complie the attached grammar,

ANTLR Parser Generator   Version 2.7.6 (2005-12-22)  
1989-2005
p.g:196: warning:nondeterminism upon
p.g:196:     k==1:ID
p.g:196:     k==2:ID,LSQUARE
p.g:196:     k==3:SEMI
p.g:196:     between alt 1 and exit branch of block

line 196 is this part:

varDeclList
	:
	(varDecl)* { ## =
#(#[VAR_DECL_LIST,"VAR_DECL_LIST"],##); }
	;

I guessed it is "varDeclList  statementList" follow
set		problem. Both "varDeclList" and "statementList"
can be none,  maybe "varDeclList" could be taken as
"statementList". But no error reported when I put both
in

noComplainsTillNow
	:
	LBRACE! varDeclList  statementList
			 "return"! expression
	;

I added another token SEMI to the end,

complainsWhenSEMI_is_Added
	:
	LBRACE! varDeclList  statementList
			 "return"! expression SEMI!
	;	

error fires:

Refer code generated for "varDeclList" and "statement"
in attached file please. 

I think 
if
((LA(1)==ID||LA(1)==LITERAL_int||LA(1)==LITERAL_boolean)
&& (LA(2)==ID||LA(2)==LSQUARE) &&
(LA(3)==RSQUARE||LA(3)==SEMI))

is quite different from 
if ((LA(1)==ID) && (LA(2)==LSQUARE)) 


Cheers

Jigang

__________________________________________________
¸Ï¿ì×¢²áÑÅ»¢³¬´óÈÝÁ¿Ãâ·ÑÓÊÏä?
http://cn.mail.yahoo.com
-------------- next part --------------
/* this part is not passed

methodDecl
	:  "public"^<AST=MiniJava.MethodDecl> dataType ID<AST=MiniJava.Identifier> LPAREN! formalList RPAREN! 
			LBRACE! varDeclList  statementList
			 "return"! expression SEMI! RBRACE!
	;	
	
*/

complainsWhenSEMI_is_Added
	:
	LBRACE! varDeclList  statementList
			 "return"! expression SEMI! // adding SEMI!, one more token added
	;
		
noComplainsTillNow
	:
	LBRACE! varDeclList  statementList
			 "return"! expression
	;
	

formalList
	:
	 (formal ( COMMA! formal)* { ## = #(#[FORMAL_LIST,"FORMAL_LIST"],##); })?
	;

formal!
    :	dt:dataType id:ID<AST=MiniJava.Identifier>
	{
		## = #( #[MINI_JAVA_FORMAL, "MINI_JAVA_FORMAL"], #dt, #id );
	}
	;

varDeclList
	:
	(varDecl)* { ## = #(#[VAR_DECL_LIST,"VAR_DECL_LIST"],##); } //Line 196
	;
		
varDecl
	: 
	dataType ID <AST=MiniJava.Identifier> SEMI^<AST=MiniJava.VarDecl>
	;
	

dataType
	:
	 ("int" LSQUARE)=> "int"! LSQUARE! RSQUARE <AST=MiniJava.IntArrayType> //int []
	| "int" <AST=MiniJava.IntegerType >
	| "boolean" <AST=MiniJava.BooleanType>
	|  ID <AST=MiniJava.IdentifierType>
	;

statementList
	:
	(statement)* { ## = #(#[STATEMENT_LIST,"STATEMENT_LIST","MiniJava.StatementList"],##); }
	;
	
statement
	:
	"System"! DOT! "out"!  DOT! "println"! LPAREN^ <AST=MiniJava.Print> expression RPAREN! SEMI!
	| "while"! LPAREN! expression RPAREN^ <AST=MiniJava.While> statement 
        | "if"! LPAREN!  expression RPAREN^<AST=MiniJava.If> statement "else"! statement 
        | LBRACE^<AST=MiniJava.Block> statementList RBRACE! 
        | (ID BECOMES)=> ID<AST=MiniJava.Identifier> BECOMES^<AST=MiniJava.Assign> expression SEMI!//a=8;
        | ID<AST=MiniJava.Identifier> LSQUARE! expression RSQUARE^<AST=MiniJava.ArrayAssign> BECOMES! expression SEMI!//a[7]=7;
	;
	

expList
	:
	(expression (COMMA^<AST=MiniJava.ExpList> expression)* )? 
	;  	
	
expression     
	:
	andExp //EOF
	;		
	
andExp
	:
	lessThanExp ( AND^<AST=MiniJava.And> lessThanExp )*
	;

lessThanExp
	:
	additiveExp (LESS_THAN^ <AST=MiniJava.LessThan> additiveExp)?
	;
		
additiveExp 
	:
	timesExp ((PLUS^<AST=MiniJava.Plus>|MINUS^<AST=MiniJava.Minus>) timesExp)* 
	;
	
timesExp
	:
	prefixExp (TIMES^ <AST=MiniJava.Times>  prefixExp)* 
	;
	
prefixExp
	:
	notExp 
	|suffixExp
	;
	
notExp
	:
	BOMB^ <AST=MiniJava.Not> suffixExp
	; 	
	
suffixExp
	:
	primaryExp 
	(LSQUARE^<AST=MiniJava.ArrayLookup> expression RSQUARE!//array[index], a[3]
	| (DOT "length")=> DOT^ <AST=MiniJava.ArrayLength> "length"!  // array.length 
	| DOT^ <AST=MiniJava.Call> ID<AST=MiniJava.Identifier> LPAREN! expList RPAREN! //classname.method(1,2,3) 
	)*	
	;	    
   
primaryExp
	:
	INT <AST=MiniJava.IntegerLiteral>
	| "true" <AST=MiniJava.True>
	| "false"<AST=MiniJava.False>
	| ID <AST=MiniJava.Identifier>
	| "this" <AST=MiniJava.This>
	|("new" ID)=>"new"! ID <AST=MiniJava.NewObject> LPAREN! RPAREN!//new object
	| "new"! ("int"!  LSQUARE <AST=MiniJava.NewArray> andExp RSQUARE!) //new array creation: new int[9] 
	| LPAREN! expression RPAREN! 
	;

/* Code generated for varDeclList:

	public void varDeclList() //throws RecognitionException, TokenStreamException
{
		
		returnAST = null;
		ASTPair currentAST = new ASTPair();
		AST varDeclList_AST = null;
		
		try {      // for error handling
			{    // ( ... )*
				for (;;)
				{
					if ((LA(1)==ID||LA(1)==LITERAL_int||LA(1)==LITERAL_boolean) && (LA(2)==ID||LA(2)==LSQUARE) && (LA(3)==RSQUARE||LA(3)==SEMI))
					{
						varDecl();
						if (0 == inputState.guessing)
						{
							astFactory.addASTChild(ref currentAST, returnAST);
						}
					}
					else 
.
.
.
.


// segment code for grammar "statement" :
				
.
.
.
else if ((LA(1)==ID) && (LA(2)==LSQUARE))
{
MiniJava.Identifier tmp35_AST = null;
tmp35_AST = (MiniJava.Identifier) astFactory.create(LT(1), "MiniJava.Identifier");
astFactory.addASTChild(ref currentAST, (AST)tmp35_AST);
match(ID);
match(LSQUARE);
expression();
if (0 == inputState.guessing)
{
	astFactory.addASTChild(ref currentAST, returnAST);
}
MiniJava.ArrayAssign tmp37_AST = null;
tmp37_AST = (MiniJava.ArrayAssign) astFactory.create(LT(1), "MiniJava.ArrayAssign");
astFactory.makeASTRoot(ref currentAST, (AST)tmp37_AST);
match(RSQUARE);
match(BECOMES);
expression();
if (0 == inputState.guessing)
{
astFactory.addASTChild(ref currentAST, returnAST);
}
	
match(SEMI);
statement_AST = currentAST.root;
}
else
.
.
.
*/


More information about the antlr-interest mailing list