Как использовать значение токена лексера 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)
)
;