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 に答える