以下语法无法与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行不匹配输入'随机'期待DIRECTION
在使用过的数据(文本文件)中,第二行已正确处理,但如上所述错误消息不是第一行。这是使用的文本文件:
The opponent shoots randomly to the left.
The opponent shoots to the right.
在“行”定义中删除那些SPACE不会发生错误。为什么呢?
答案 0 :(得分:1)
输入的第一行是错误的。您没有指定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}
答案 1 :(得分:0)
经过多次尝试,这是真正符合所期望的行为:
row : START SPACE (RANDOM)? (SPACE)? direction Dot (LineBreak | EOF);