Как использовать значение токена лексера ANTLR в условной перезаписи правила

Я новичок в ANTLR и хотел бы сделать следующее:

Учитывая приведенный ниже фрагмент грамматики, у меня есть правило выбора * сравнение_оп *, которое может соответствовать одному из многих токенов. Я хотел бы написать правила условного перезаписи, например, если токен DOESNOTENDWITH что-то делает, если он DOENOTCONTAIN что-то делает и т. Д.

Я просто не могу понять это правильно. Возможно ли это сделать? Конечно, я могу написать конкретные правила для каждого условия, но это тоже не лучший способ.

Какие-либо предложения?


{... 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);

1 ответ

Попробуй это:

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)
               )
 ;
Другие вопросы по тегам