В сообщении об ошибке указано, в чем проблема: у вас есть определенные правила лексера, и они не могут быть сопоставлены, потому что другое правило лексера уже соответствует тому же вводу. Также имейте в виду, что ANTLR4 соответствует правилам следующим образом:
- Правило с самым длинным соответствием выигрывает (жадное соответствие).
- Если два или более правил соответствуют одному и тому же входу, первый, появившийся в грамматике, выигрывает.
Теперь проверьте свою грамматику на соответствие этому процессу, и вы заметите, что ваше правило лексера VAR
соответствует всему тому, что будет соответствовать IF
, ELSE
и т. д. , Но так как VAR
появляется перед другими в грамматике, он всегда будет выигрывать за ввод, такой как if
et c. Теперь следствие должно быть ясным: переместите правило «поймать все» VAR
за вашими правилами для ключевых слов (IF
, THEN
et c.).
Еще одна вещь, которую вы должны иметь в виду, это что такие ключевые слова никогда не будут соответствовать как правило VAR
. Если вам необходимо поддерживать (в особых случаях) ключевые слова в качестве идентификаторов, то ищите в SO решения, как это уже обсуждалось ранее.