Antlr4: посторонний ввод в antlr4

У меня проблема с запуском потока ввода для моей грамматики, вот часть моей грамматики

expression  
:  .... 
|   ( '+' | '-' | '&' |) expression
|   expression ('+'|'-') expression
   ....
;

при входном потоке типа 2 + 2-2 или (2 + 2 + 2) -2 возникает ошибка

line 10:30 extraneous input '-2' expecting {',', '^',...}

почему моя грамматика не умеет различать -2 и 2-2? кто-нибудь, помогите мне, пожалуйста!


person wied    schedule 11.06.2013    source источник


Ответы (1)


Похоже, что вы написали свой лексер таким образом, что -2 приводит к единственному токену. Вместо того, чтобы обрабатывать таким образом отрицательные числа, рассматривайте - как унарный оператор и позвольте вашему синтаксическому анализатору обрабатывать операцию отрицания. Если вы попытаетесь обработать отрицательные числа непосредственно в лексере, ввод, такой как 2-2, будет отправлен в синтаксический анализатор в виде 2 последовательных числовых токенов (2, за которыми следует -2) вместо желаемых 3 токенов (2, -, 2).

person Sam Harwell    schedule 11.06.2013
comment
извините, но я просто скопировал часть java.g4 (только правило выражения) из книги примеров antlr v4. вы можете привести мне пример, чтобы решить эту проблему? - person wied; 11.06.2013
comment
хорошо, я понимаю, что вы имеете в виду, потому что я добавил префикс в DECIMAL_LITERAL: ('-')? ('0' | '1' .. '9' '0' .. '9' *) IntegerTypeSuffix? ; спасибо, сэм. - person wied; 11.06.2013