Этот вопрос касается того, как отличать необязательные токены при посещении правила antlr.Различают дополнительные маркеры при посещении правила Antlr
У меня есть правило парсера, которое я определил в грамматике antlr4 под названием 'assign', которая пытается присвоить результат выражения тегу, представленному INT, например 215 = «FOO». Он также позволяет присваивать тегу индекс, например 215 [2] = "FOO". Мой вопрос в том, как я могу отличить INTs формы 215 от формы 215 [2], посмотрев объекты, предоставленные antlr, во время оценки правила назначения?
assign : INT '=' expr ;
INT : '-'? DIGIT+ ('[' DIGIT+ ']')?;
DIGIT : [0-9] ;
Я определил метод посетителя, чтобы захватить оценку парсера правила "назначить" для потока токенов:
215 [2] = "Foo"
@Override
public String visitAssign(@NotNull FixRulesParser.AssignContext ctx) {
String left = ctx.getStart().getText();
String right = ctx.getStop().getText();
...
В этом point left = "215 [2]" и right = "FOO"
Предлагает ли ctx-объект способ определить, содержит ли левая часть задания (215 [2]) необязательный параметр '[2]' определяемый INT? Я хочу отличить INTs формы 215 [2] против 215. Я использую регулярное выражение Java для анализа «left» (см. Ниже), чтобы сделать определение, но мне интересно, могу ли я получить ответ напрямую из antlr.
Pattern p = Pattern.compile("(-?\\d+)((\\[)(\\d+)(\\]))?");