如何处理由ANTLR生成的树?

时间:2019-04-13 17:13:05

标签: java antlr4

我正在使用ANTLR创建计算机代数系统。到目前为止,我已经能够生成树并从树中读取信息。现在,我需要通过读取树的叶节点,检测它们是否可以简化然后进行简化来实现代数简化。

有没有方法可以更改叶节点的值并将其删除?

这是我的代码,其输出生成:

import java.io.FileInputStream;
import java.io.IOException;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import org.omg.CORBA.portable.InputStream;

public class CAS {

    public static void main(String[] args) throws IOException {

        FileInputStream inputstream = new FileInputStream("d:\\input.txt");
        CharStream cs = CharStreams.fromStream(inputstream);

        HelloLexer lexer = new HelloLexer(cs);
        CommonTokenStream tokens = new CommonTokenStream(lexer);

        System.out.println("Tokens:");
         tokens.fill();
         for (Token token : tokens.getTokens())
         {
             System.out.println(token.toString());
         }

         HelloParser parser = new HelloParser(tokens);
         ParseTree tree = parser.expr();

         System.out.println("\nParse tree (Lisp format):");
         System.out.println(tree.toStringTree(parser));
    }
}
//Output
Tokens:
[@0,0:0='2',<8>,1:0]
[@1,1:1='x',<9>,1:1]
[@2,2:2='+',<4>,1:2]
[@3,3:3='3',<8>,1:3]
[@4,4:3='<EOF>',<-1>,1:4]

Parse tree (Lisp format):
(expr (expr (factor (term 2) (factor (term x)))) + (expr (factor (term 3))))

1 个答案:

答案 0 :(得分:2)

不要操纵解析器创建的树。这代表原始输入。取而代之,应用简化转换并生成 new 树,该树的格式可能易于从中生成新代码,而不是使用原始树结构。