在ANTLR中动态重写列表中的3 n个节点
我正在使用ANTLR3解析和重写答案集程序(ASP)。我想做的是解析一个ASP程序,并输出一个带有重写的AST。我可以轻松地在AST中添加和删除节点,但我需要做的是动态地将节点添加到根目录中(有效地,向ASP程序添加新规则)。要添加的节点和数量取决于输入的ASP程序 下面我有一个来自我的lexer和解析器的示例,它输出一个AST。r_规则返回一个LinkedHashMap,该LinkedHashMap根据匹配的内容填充。对于LinkedHashMap的每个成员,在rewrite For r_程序中,我想向根节点程序添加一个新节点。然而,我似乎找不到一种方法来迭代LinkedHashMap并添加新节点在ANTLR中动态重写列表中的3 n个节点,antlr,antlr3,answer-set-programming,Antlr,Antlr3,Answer Set Programming,我正在使用ANTLR3解析和重写答案集程序(ASP)。我想做的是解析一个ASP程序,并输出一个带有重写的AST。我可以轻松地在AST中添加和删除节点,但我需要做的是动态地将节点添加到根目录中(有效地,向ASP程序添加新规则)。要添加的节点和数量取决于输入的ASP程序 下面我有一个来自我的lexer和解析器的示例,它输出一个AST。r_规则返回一个LinkedHashMap,该LinkedHashMap根据匹配的内容填充。对于LinkedHashMap的每个成员,在rewrite For r_程序
@members {
int rID = 0;
}
r_program
: (a=r_rule)* -> ^(PROGRAM r_rule*);
r_rule returns [LinkedHashMap<String, String> somehm]
@init {
$somehm = new LinkedHashMap<String, String>();
String strrID = Integer.toString(++rID);
}
: (head = r_head) ':-'
body=r_body[strrID] {$vartypes.putAll($body.vartypes); } -> ^(LIMPL $head ^(EXTENSION ^(NUMBER[strrID] $head)) $body);
AST的一个例子是,为图纸道歉(注意,严格来说,这是一个用于可读性的例子,实际上在重写过程中使用了更多的节点)
我可以继续说,如果变量可以被绑定,那么每个规则对变量的绑定都是不同的。不同的输入会改变程序子级的数量和内容。更好的选择是让
r\u规则
返回一个普通的ANTLR树节点,而不是JavaMap
。您能提供一些示例输入和所需的AST吗?谢谢Bart,我添加了一个示例输入和输出。现在,我将研究如何在Java中动态创建一个ANTLR树节点,并了解如何使用它。嗯,看看您的更新,我不确定我的建议是否有用。尝试在语法本身中填充这种类型的树重写可能会导致语法文件包含比ANTLR规则更多的Java代码。我想我应该从ANTLR获得一个简单的AST,然后在其他地方用普通Java代码进行转换。
head_pred(X, Y, Z) :- body_1(X), body_1(Y), body_1(Z).
PROGRAM
|
|____:-
| |____head_pred(X, Y, X)
| |____body_1(X)
| |____body_1(Y)
| |____body_1(Z)
| |____X == Y
|
|____:-
| |____head_pred(X, Y, X)
| |____body_1(X)
| |____body_1(Y)
| |____body_1(Z)
| |____X == Z