ANTLR4:规则 'RULE' 包含一个闭包,其中包含至少一个可以匹配空字符串的替代项



我正在用ANTLR4编写文件解析器。该文件可以有许多块,这些块都以 (BEGIN |结束(关键字。这是一个非常简单的例子:

grammar test;
BEGIN: 'BEGIN';
END:   'END';
HEADER:'HEADER';
BODY:  'BODY';
file: block+;
ID: [A-Za-z];
NUM: [0-9];
block:
| BEGIN HEAD statement* END HEAD
| BEGIN BODY statement* END BODY
;
statement: ID '=' NUM;

抛出的错误是error(153): test.g4:8:0: rule file contains a closure with at least one alternative that can match an empty string ,我不明白,因为file至少有一个空块,具有开始-结束样式。有人看到我在这里错过了什么吗?

block可以匹配空字符串,因为冒号和第一个|之间没有任何内容。然后在file中,您使用block+。这会导致错误,因为您要将+应用于可以匹配空字符串的内容,这可能会导致不消耗任何输入的无限 looo。

要解决此问题,只需删除block中的第一个|

相关内容

最新更新