2013-05-15 3 views
0

Я новичок в использовании ANTLR. У меня есть ANTLR грамматика, которая создает АСТ. Я хочу проверить, что если ComparisonExpr содержит FuzzyExpr, я хочу удалить этот узел ComparisonExpr и соединение ("и", "или") перед этим ComparisonExpr (если есть) из AST. Пожалуйста, предложите мне, как это сделать. Я не знаю, что я могу сделать по нормальному правилу перезаписи ANTLR или нет?удалить узел в базе AST по условию

Например

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

+0

Какую версию ANTLR вы используете? Это будет иметь значение для ответа. – monty0

+0

@ monty0, появление 'output = AST' в опциях предполагает, что OP использует v3. –

+0

@Bart Kiers, я считаю, что это может быть ANTLR 2 с этими опциями. – monty0

ответ

0

Вы можете сделать это переписать правила. Вот эскиз если вы укоренить свои дерева с оператором:

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

Вы кладете семантические предикаты перед деревом строительных заявлений. Первый предикат для сопоставления будет выбирать, какое дерево записывается. Если ничего не будет найдено, последний будет использоваться.

+0

Nope, '-> ^()' является незаконным. Чтобы создать «пустой» АСТ, просто сделайте '->', необязательно с комментарием, чтобы очистить пустой AST. Кроме того, вам не нужны двойные стрелки, '->', в альтернативах. И, наконец, '->^(X)' равно '-> X'. Я взял на себя смелость, чтобы отредактировать ваш ответ. –

+0

Спасибо за помощь, пример намного яснее (и правильно) сейчас! – monty0

+0

Большое спасибо за вашу помощь. Это полезно для меня. Я использую ANTLR v.3. –

Смежные вопросы