[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