[antlr-interest] Tree generation qestion

=?gb2312?q?=CB=EF=BC=CD=B8=D5=20Jigang=20(Robert)=20Sun?= sunjigang1965 at yahoo.com.cn
Fri Feb 24 13:18:53 PST 2006


Code generated by the attached grammar only produces a
root StatementList node contains an empty list of
Statement. After remove ! from end of 
"statementList", desired result got. Is this normal?

While the following grammar works well.

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

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

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

Cheers.

Jigang


		
___________________________________________________________ 
ÎÞÏÞÈÝÁ¿ÑÅ»¢Ïà²á£¬Ô­Í¼µÈ´óÏÂÔØ£¬³¬¿ìËٶȣ¬¸Ï¿ìÇÀ×¢£¡ 
http://cn.photos.yahoo.com
-------------- next part --------------
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
	:
	(andExp (COMMA^<AST=MiniJava.ExpList> andExp)* )? 
	;  	
	
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> andExp 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), call a class method, class Call.cs 
	)*	
	;	    
   
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] primaryExp is Exp
	| LPAREN! andExp RPAREN! //primaryExp is Exp
	;



More information about the antlr-interest mailing list