[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