你好我的问题:
我写了一个antlr语法,编译并创建了一个关于antlr的好东西。现在我想创建一些TDS,我必须探索我的AST,我写了一个java代码来做到这一点,我没有错误但我的程序只返回AST的第一层,如果有人可以帮助我:有我的语法:
grammar Grammaire;
options{
k=1;
output = AST;
}
tokens{
INIT;
CONDITION;
INC;
DEC_VAR;
DEC_CLASSE;
LISTE_ATTRIBUTS;
LISTE_PARAMETRES;
LISTE_PARAMETRES_EFFECTIFS;
DEC_ATTRIBUT;
DEC_METHOD;
PROGRAMME;
PARAMETRE;
BODY;
DO;
WRITE;
READ;
THIS;
NEW;
SUPER;
RETURN;
IF;
THEN;
ELSE;
DO;
FOR;
APPEL_MET;
BLOC;
}
prog : (class_decl)* (var_decl)* (instruction)+ -> ^(PROGRAMME ^(class_decl)* ^(var_decl)* ^(instruction)*);
class_decl : 'class' IDF_CLASS ( 'inherit' IDF_CLASS )? '=' '{' class_item_decl '}' -> ^(DEC_CLASSE IDF_CLASS (IDF_CLASS)? class_item_decl );
class_item_decl : (var_decl)* (method_decl)* -> ^(BODY ^(LISTE_ATTRIBUTS ^(var_decl)*)? ^(method_decl)*) ;
var_decl : 'var' IDF_METHOD ':' type ';' -> ^(DEC_VAR IDF_METHOD type);
type : IDF_CLASS
|'int'
|'string'
;
method_decl : 'method' IDF_METHOD '(' method_args*')' (':' type)? '{' var_decl* instruction+ '}' -> ^(DEC_METHOD (type)? IDF_METHOD ^(LISTE_PARAMETRES (method_args)*)? ^(BODY var_decl* instruction+));
method_args : IDF_METHOD ':' type (',' IDF_METHOD ':' type)* -> ^(PARAMETRE IDF_METHOD type)*;
instruction : idf_method
|'if' expression 'then' instruction ('else' instruction)? 'fi' -> ^(IF expression ^(THEN instruction) ^(ELSE instruction)? )
|'for' IDF_METHOD 'in' expression '..' expression 'do' instruction+ 'end'-> ^(FOR ^(CONDITION IDF_METHOD expression expression) ^(BODY (instruction)+))
|'{' var_decl* instruction+ '}' -> ^(BLOC var_decl* instruction+)
|'do' expression ';'-> ^(DO expression)
|write
|read
|retour
;
idf_method : IDF_METHOD ':=' rule_garb -> ^(':='IDF_METHOD rule_garb);
rule_garb
: expression ';' -> expression
| 'nil' ';'
;
write : 'write' print -> ^(WRITE print)
;
print : expression ';'-> expression
;
read : 'read' IDF_METHOD ';' -> ^(READ IDF_METHOD);
retour : 'return' '(' expression ')' ';' -> ^(RETURN expression) ;
expression : 'this' (test)? -> ^(THIS (test)?)
|'super' (test)? -> ^(SUPER (test)?)
|'new' IDF_CLASS (test)? -> ^(NEW IDF_CLASS (test)?)
|exprPlusMoins -> ^(exprPlusMoins)
;
exprPlusMoins : multexpr (('+' ^ | '-' ^)multexpr) * ;
multexpr : exprComp('*' ^ exprComp)* ;
exprComp : exprMoins (( '<' ^ | '>' ^ | '<=' ^ | '>=' ^ | '==' ^ | '!=' ^ ) exprMoins)?;
exprMoins
: ('-' ^ )? atom;
atom : IDF_METHOD(test)? -> ^(APPEL_MET IDF_METHOD (test)?)
|CSTE_ENT
|CSTE_BOOLEAN
|CSTE_CHAINE
|'(' expression ')'-> ^(expression)
;
test : '.'IDF_METHOD '(' expression? (',' expression)* ')' -> IDF_METHOD (^(LISTE_PARAMETRES_EFFECTIFS (expression)*))? ;
CSTE_BOOLEAN : 'TRUE'
|'FALSE'
;
IDF_CLASS : ('A'..'Z')('a'..'z'|'A'..'Z'|'_'|'0'..'9')* ;
IDF_METHOD : ('a'..'z')('a'..'z'|'A'..'Z'|'_'|'0'..'9')* ;
CSTE_ENT : '0'..'9'+ ;
NEWLINE:('\r'? '\n') + {$channel=HIDDEN;};
WS : (' '|'\t')+ {$channel=HIDDEN;} ;
CSTE_CHAINE : '"' (.+) '"';
COMM : ('/*').*('*/'){$channel=HIDDEN;};
有我的代码:
import java.io.*;
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
public class __Test__ {
public static void main(String args[]) throws Exception {
String classPath =("/home/frozzen/compil/cholleyb1u/TEST/test2.txt");
File code =new File(classPath);
byte[] buffer = new byte[(int)code.length()];
DataInputStream in = new DataInputStream(new FileInputStream(code));
in.readFully(buffer);
in.close();
String retour = new String(buffer);
GrammaireLexer Lex = new GrammaireLexer(new ANTLRStringStream(retour));
GrammaireParser parser = new GrammaireParser(new CommonTokenStream(Lex));
CommonTokenStream tokens = new CommonTokenStream(Lex);
CommonTree tree = (CommonTree)parser.prog().getTree();
System.out.println(tree.toStringTree());
}
}
并且有我想要获得AST的源代码:
class Math =
{
var param : int;
method pow(a:int,b:int) :int
{
var retval : int;
var i : int;
if b == 0
then
return (1);
fi
retval :=1;
for i in 1 .. b
do
retval := retval*a;
end
return (retval);
}
}
var m : Math;
m:= new Math;
write m.pow(2,3);