ANTLR 4.5: строка 1:22 не соответствует вводу «случайно» в ожидании НАПРАВЛЕНИЯ

Следующая грамматика не работает должным образом с Antlr4.5 и Java 1.8.45 (IDE: IntelliJ Ultimate 14.1.4):

grammar PlayerAIShots;
file : row row EOF ;
row : START (randomshot)? SPACE direction Dot (LineBreak | EOF);

randomshot: RANDOM ;
direction : DIRECTION ;

RANDOM : 'randomly' ;
DIRECTION : ('to the left'|'to the right'|'central') ;
START : 'The opponent shoots' ;
SPACE : ' ' ;
Dot : '.' ;

// line break
LineBreak : '\r'?'\n' | '\r';

WS : [\t\r\n]+ -> skip ; // skip tabs, newlines

Если позволить сгенерированному лексеру и синтаксическому анализатору оценить результаты:

строка 1:22 не соответствует вводу «случайно», ожидая НАПРАВЛЕНИЕ

В используемых данных (текстовый файл) правильно обрабатывалась вторая строка, но, как и в приведенном выше сообщении об ошибке, не первая. Вот используемый текстовый файл:

The opponent shoots randomly to the left.
The opponent shoots to the right. 

При удалении этих ПРОБЕЛов в определении "строка" ошибка не возникает. Почему?


person Pille    schedule 09.07.2015    source источник


Ответы (2)


Первая строка вашего ввода неверна. Вы не указали, что вам требуется пробел между START и randomshot, как здесь

row : START (SPACE randomshot)? SPACE direction Dot (LineBreak | EOF);

Когда вы удалите «ПРОБЕЛ» из определения «строки», вы получите еще больше ошибок.

line 1:19 extraneous input ' ' expecting {'randomly', DIRECTION}
line 1:28 extraneous input ' ' expecting DIRECTION
line 2:19 extraneous input ' ' expecting {'randomly', DIRECTION}
person janisz    schedule 09.07.2015
comment
Спасибо за ваш ответ. Когда я ставлю пробел между «START» и «randomshot», я получаю: строка 2:22 отсутствует « » в «справа». Я думаю, потому что двойной "КОСМОС". Если я удалю второй «ПРОБЕЛ» перед направлением, я получаю еще одну ошибку: строка 1:30 посторонний ввод «» ожидает НАПРАВЛЕНИЕ. - person Pille; 09.07.2015
comment
Да, это двойной SPACE, я добавил пример, как с этим справиться. - person janisz; 09.07.2015

После нескольких попыток это действительно соответствовало желаемому поведению:

row : START SPACE (RANDOM)? (SPACE)? direction Dot (LineBreak | EOF);
person Pille    schedule 09.07.2015
comment
Я не думаю, что это правильное решение. Вы допускаете двойной пробел между START и направлением. Подумайте о следующем входе: The opponent shoots to the right. - person janisz; 09.07.2015
comment
Вы правы, но второе ПРОСТРАНСТВО могло быть или не быть, как говорится так: (ПРОБЕЛ)? (один или ни одного). Это работает, но ваше решение выше гораздо правильнее. Спасибо. - person Pille; 09.07.2015