0

我是使用 ANTLR 的新手。我有创建 AST 的 ANTLR 语法。我想检查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;

谢谢你。潘尼帕

4

1 回答 1

0

你可以这样做重写规则。这是一个草图,假设您使用操作员来根植您的树:

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

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

于 2013-05-16T15:53:54.930 回答