ANTLR4:规则“ RULE”包含一个闭包,该闭包至少具有一个可以匹配空字符串的选项

时间:2018-06-22 21:17:20

标签: antlr4

我正在使用ANTLR4编写文件解析器。该文件可以具有多个块,所有块均以(BEGIN | END)关键字开头和结尾。这是一个非常简单的示例:

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至少有一个空的块,其开头是结尾样式。有人看到我在这里想念的吗?

1 个答案:

答案 0 :(得分:1)

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

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