Java - 带有语法的抽象语法树

Java - Abstract Syntax Tree with grammar

我正在使用正则表达式构建一个简单的语法分析器。它有效,但现在我想添加抽象语法树。但我仍然不明白如何设置它。我包括了解析器。 解析器获取一个字符串并用词法分析器对其进行标记。
标记包括值和类型。 知道如何设置节点来构建 AST 吗?

public class Parser {
    lexer lex;
    Hashtable<String, Integer> data = new Hashtable<String, Integer>();


    public Parser( String str){
       ArrayList<Token> token = new ArrayList<Token>();

       String[] strpatt = { "[0-9]*\.[0-9]+", //0
                            "[a-zA-Z_][a-zA-Z0-9_]*",//1
                            "[0-9]+",//2
                            "\+",//3
                            "\-",//4
                            "\*",//5
                            "\/",//6
                            "\=",// 7
                            "\)",// 8
                            "\("//9
                          };

        lex = new lexer(strpatt, "[\ \t\r\n]+");
        lex.set_data(str);
    }
    public int peek() {
      //System.out.println(lex.peek().type);
      return lex.peek().type;
    }
    public boolean peek( String[] regex) {
      return lex.peek(regex);
    }
    public void set_data( String s) {
      lex.set_data(s);
    }
    public Token scan() {
      return lex.scan();
    }
    public int goal() {
      int ret = 0;
      while(peek() != -1) {
        ret = expr();
      }
      return ret;
    }


}


目前,您只是在解析时进行评估:

ret = ret * term()

想到 AST 的最简单方法是它只是一种不同的评估。不是像上面那样从数值子计算中生成数值结果,而是从子计算的描述中生成计算的 描述。描述表示为包含基本信息的小结构:

ret = BuildProductNode(ret, term());

或者,也许

    ret = BuildBinaryNode(Product, ret, term());

它是一棵树,因为传递的节点对象引用其他节点对象,而没有循环或具有两个不同父节点的节点。

显然上面缺少很多细节,尤其是 Node 对象的确切性质。但这是一个粗略的轮廓。