3

我是 ANTLR 的新手,想做以下事情:

鉴于下面的语法片段,我有一个选择规则 *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 回答