ANTLR4:规则 'RULE' 包含一个闭包,其中至少有一个可以匹配空字符串的替代项
ANTLR4: rule 'RULE' contains a closure with at least one alternative that can match an empty string
我正在用 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
至少有一个空块,具有 begin-end 样式。有人看到我在这里遗漏了什么吗?
block
可以匹配空字符串,因为冒号和第一个 |
之间没有任何内容。然后在 file
中,你使用 block+
。这会导致错误,因为您将 +
应用于可以匹配空字符串的内容,这可能会导致不消耗任何输入的无限循环。
要解决此问题,只需删除 block
中的第一个 |
。
我正在用 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
至少有一个空块,具有 begin-end 样式。有人看到我在这里遗漏了什么吗?
block
可以匹配空字符串,因为冒号和第一个 |
之间没有任何内容。然后在 file
中,你使用 block+
。这会导致错误,因为您将 +
应用于可以匹配空字符串的内容,这可能会导致不消耗任何输入的无限循环。
要解决此问题,只需删除 block
中的第一个 |
。