2016-12-22 8 views
1

Я пытаюсь разобрать следующую грамматику, где Value может быть любой символ до точки с запятой, но я не могу заставить его работать правильно:не Разбираем любой символ до точки с запятой в ANTLR4

grammar Test; 

pragmaDirective : 'pragma' Identifier Value ';' ; 

Identifier : [a-z]+ ; 

Value : ~';'* ; 

WS : [ \t\r\n\u000C]+ -> skip ; 

Когда я проверить его с pragma foo bar;, я получаю следующее сообщение об ошибке:

line 1:6 extraneous input ' ' expecting Identifier 
line 1:11 extraneous input 'bar' expecting ';' 

ответ

0

Попробуйте это:

pragmaDirective : 'pragma' Identifier .*? ';' ; 

и удалить Value правило. Это должно выполнить эту работу.

И рекомендации: определите правила для ваших литералов (например, «прагма») вместо определения их непосредственно в правилах парсера.

+0

В результате я определил новое правило парсера для значения прагмы. Это была моя первая попытка написать парсер с ANTLR, и мне следовало бы продолжить чтение. Спасибо за рекомендацию! –

0

правило Значение слишком жадный. Правила Lexer стараются соответствовать как можно больше, поэтому для ввода вот так: pragma mu foo;, правило Value будет соответствовать pragma mu foo. В конце концов, это ноль или больше символов, кроме точки с запятой.

Value не подходит для использования в качестве правила лексера. Я предлагаю вам пересмотреть свой подход. Возможно, создайте правило парсера value, которое соответствует Identifier и, возможно, другим правилам лексера. Трудно сделать предложение, не видя большую часть «реальной» грамматики (вы, вероятно, разместили тупую версию грамматики, над которой вы работаете).