Java 根据条件删除AST中的节点

Java 根据条件删除AST中的节点,java,antlr,abstract-syntax-tree,Java,Antlr,Abstract Syntax Tree,我是新使用ANTLR的。我有一个ANTLR语法,它创建了一个AST。我想检查一下,如果ComparisonExpr包含FuzzyExpr,那么我想从AST中删除这个ComparisonExpr节点和这个ComparisonExpr(如果有)前面的连接词(“and”、“or”)。请告诉我怎么做。我不知道我能不能按照ANTLR的正常重写规则来做 比如说 Given the input: where $GPA = #high and age = 25 I want the output like th

我是新使用ANTLR的。我有一个ANTLR语法,它创建了一个AST。我想检查一下,如果ComparisonExpr包含FuzzyExpr,那么我想从AST中删除这个ComparisonExpr节点和这个ComparisonExpr(如果有)前面的连接词(“and”、“or”)。请告诉我怎么做。我不知道我能不能按照ANTLR的正常重写规则来做

比如说

Given the input: where $GPA = #high and age = 25
I want the output like this: where age = 25
(delete the conjunction "and" and ComparisonExpr=>"$GPA = #high") because it has the FuzzyExpr=>"#hight")
这是我语法的一部分

grammar Test;
options{
output=AST;
ASTLabelType=CommonTree;
}

WhereClause      :="where" ExprSingle;
ExprSingle       :OrExpr;
OrExpr           :AndExpr ("or" AndExpr)*;
AndExpr          :ComparisonExpr ("and" ComparisonExpr)*;
ComparisonExpr   :ValueExpr((ValueComp)ValueExpr)?;
ValueExpr        :ValidateExpr
                 |PathExpr 
                 |ExtensionExpr 
                 |FuzzyExpr;
FuzzyExpr        :"#" Literal;
多谢各位。
Pannipa

您可以重写规则。下面是一个草图,假设您使用操作符在树上生根:

^(OR e1=expr e2=expr) 
 -> {isFuzzy($e1) && isFuzzy($e2)}? /* empty */
 -> {isFuzzy($e1)}?                 $e2
 -> {isFuzzy($e2)}?                 $e1
 ->                                 ^(OR $e1 $e2)
;

将语义谓词放在树构建语句的前面。要匹配的第一个谓词将选择要写入的树。如果没有匹配项,将使用最后一个。

您使用的是哪个版本的ANTLR?答案会有所不同。@monty0,选项中出现的
output=AST
表明OP使用的是v3。@Bart Kiers,我相信这些选项也可能是ANTLR 2。@monty0,不,在旧的v2时代,它的语法不同:不,
->^()
是非法的。要生成一个“空”AST,只需执行
->
,还可以选择添加注释,以明确创建了一个空AST。此外,您不希望在备选方案中使用双箭头,
->
。最后,
->^(X)
等于
->X
。我冒昧地编辑了你的答案。谢谢你的帮助,这个例子现在更清楚(和正确)了!非常感谢你的帮助。这对我很有用。我使用ANTLR v.3。如果这对你有效,请接受它作为答案,这样人们就会看到你的问题已经得到了回答。