изтриване на възел в AST база при условие

Нов съм в използването на ANTLR. Имам граматиката на ANTLR, която създава AST. Искам да проверя дали ComparisonExpr съдържа FuzzyExpr, тогава искам да изтрия този ComparisonExpr възел и връзката („и“, „или“) пред този ComparisonExpr (ако има) от AST. Моля, предложете ми как да го направя. Не знам дали мога да направя с нормално правило за пренаписване на 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;

Благодаря ти. Панипа


person pannipa saeung    schedule 15.05.2013    source източник
comment
Коя версия на ANTLR използвате? Това ще има значение за отговора.   -  person monty0    schedule 15.05.2013
comment
@monty0, появата на output=AST в опциите предполага, че OP използва v3.   -  person Bart Kiers    schedule 15.05.2013
comment
@Bart Kiers, вярвам, че може да бъде и ANTLR 2 с тези опции.   -  person monty0    schedule 15.05.2013
comment
@monty0, не, в старите v2-times беше различен синтаксис: antlr2.org/ doc/options.html   -  person Bart Kiers    schedule 15.05.2013


Отговори (1)


Можете да направите това, пренаписвайки правила. Ето скица, ако приемем, че руутвате вашите дървета с оператора:

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

Поставяте семантични предикати пред изявленията си за изграждане на дърво. Първият предикат за съвпадение ще избере кое дърво е написано. Ако нищо не съвпада, ще се използва последното.

person monty0    schedule 16.05.2013
comment
Не, -> ^() е незаконно. За да създадете празен AST, просто направете ->, по желание с коментар, за да стане ясно, че е създаден празен AST. Освен това не искате двойни стрелки, ->, в алтернативите. И накрая, -> ^(X) е равно на -> X. Позволих си да редактирам отговора ви. - person Bart Kiers; 16.05.2013
comment
Благодаря за помощта, примерът вече е много по-ясен (и правилен)! - person monty0; 16.05.2013
comment
Благодаря ви много за вашата помощ. Полезно ми е. Използвам ANTLR v.3. - person pannipa saeung; 20.05.2013
comment
Ако това работи за вас, моля, приемете го като отговор, така че хората да видят, че вашият въпрос е получил отговор. - person monty0; 20.05.2013