3

私はANTLRに慣れていないので、次のことをしたいと思います。

以下の文法スニペットを考えると、多くのトークンの 1 つに一致する選択規則 *comparison_op* があります。私がやりたいのは、条件付きの書き換えルールを書くことです-たとえば、トークンがDOESNOTENDWITHの場合は何かを行い、DOESNOTCONTAINの場合は何かを行います.

私はこれを正しく理解できないようです。これを行うことさえ可能ですか?もちろん、条件ごとに特定のルールを書くこともできますが、それも最善の方法ではないようです。

助言がありますか?


{... snipped ...}

DOESNOTBEGINWITH        : 'does not begin with';
DOESNOTENDWITH          : 'does not end with';
DOESNOTCONTAIN          : 'does not contain';

comparison_op           : DOESNOTBEGINWITH | DOESNOTENDWITH | DOESNOTCONTAIN
condition_comparison    : (column_name comparison_op v1=valueExpression) 
                        ->  {$comparison_op.text == $DOESNOTBEGINWITH.text}?  
                                    ^(LIKE column_name $v1)
                        ->          ^(comparison_op column_name $v1);
4

1 に答える 1

2

これを試して:

condition_comparison
 : (column_name comparison_op v1=valueExpression) 
    -> {$comparison_op.start.getType() == DOESNOTBEGINWITH}? 
       ^(LIKE column_name $v1)
    -> ^(comparison_op column_name $v1)
 ;

ただし、次のように記述しても問題はありません。

condition_comparison
 : column_name ( DOESNOTBEGINWITH valueExpression -> ^(LIKE column_name valueExpression)
               | DOESNOTENDWITH valueExpression   -> ^(DOESNOTENDWITH column_name valueExpression)
               | DOESNOTCONTAIN valueExpression   -> ^(DOESNOTCONTAIN column_name valueExpression)
               )
 ;
于 2013-01-22T07:32:23.863 に答える