[英]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.