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 对象的确切性质。但这是一个粗略的轮廓。
我正在使用正则表达式构建一个简单的语法分析器。它有效,但现在我想添加抽象语法树。但我仍然不明白如何设置它。我包括了解析器。
解析器获取一个字符串并用词法分析器对其进行标记。
标记包括值和类型。
知道如何设置节点来构建 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 对象的确切性质。但这是一个粗略的轮廓。