簡體   English   中英

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 對象引用其他 Node 對象,而沒有循環或具有兩個不同父節點的節點。

顯然,上面遺漏了很多細節,尤其是 Node 對象的確切性質。 但這是一個粗略的輪廓。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM