使用parser.prog.getTree()完成AST不完整

时间:2017-03-20 10:31:35

标签: java antlr abstract-syntax-tree

你好我的问题:

我写了一个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);

0 个答案:

没有答案