Я создаю грамматику прямо сейчас, и мне пришлось избавиться от левой рекурсии, и, похоже, это работает для всего, кроме оператора сложения.
Вот связанная часть моей грамматики:
SUBTRACT: '-';
PLUS: '+';
DIVIDE: '/';
MULTIPLY: '*';
expr:
(
IDENTIFIER
| INTEGER
| STRING
| TRUE
| FALSE
)
(
PLUS expr
| SUBTRACT expr
| MULTIPLY expr
| DIVIDE expr
| LESS_THAN expr
| LESS_THAN_OR_EQUAL expr
| EQUALS expr
)*
;
INTEGER: ('0'..'9')*;
IDENTIFIER: ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')*;
Тогда, когда я пытаюсь сделать что-то вроде
x*1
Это работает отлично.Однако, когда я пытаюсь сделать что-то вроде
x+1
, я получаю сообщение об ошибке:
MismatchedTokenException: несоответствующий ввод '+' ожидание '\ u001C'
Я занимался этим некоторое время, но не понимаю, почему это работает с *, - и /, но не +.У меня точно такой же код для всех них.
Редактировать: Если я переупорядочу его и поставлю SUBTRACT выше PLUS, символ + теперь будет работать, но символ - не будет.Почему Antlr заботится о порядке подобных вещей?