ANTLR:空状态不工作

ANTLR:空状态不工作,antlr,Antlr,我希望能够解析int[]或int标记 考虑以下语法: TYPE : 'int' AFTERINT; AFTERINT: '[' ']'; 当然可以,但只适用于int[]。为了使它也适用于int,我将AFTERINT更改为这个(添加了一个空条件): AFTERINT: '[' ']' | |; 但现在我得到了这个警告和错误: [13:34:08]警告(200):MiniJava.g:5:9:决策可以匹配输入 例如“使用多个备选方案:2、3” 因此,

我希望能够解析int[]或int标记

考虑以下语法:

TYPE    :   'int' AFTERINT;
AFTERINT:   '[' ']';
当然可以,但只适用于int[]。为了使它也适用于int,我将
AFTERINT
更改为这个(添加了一个空条件):

AFTERINT:   '[' ']' |
              |;
但现在我得到了这个警告和错误:

[13:34:08]警告(200):MiniJava.g:5:9:决策可以匹配输入 例如“使用多个备选方案:2、3”

因此,该输入的备选方案3被禁用[13:34:08] 错误(201):MiniJava.g:5:9:以下备选方案永远不可能 匹配:3


为什么空条件不起作用?

lexer无法处理与空字符串匹配的标记。如果您想一想,这并不奇怪:毕竟,输入中有无限多的空字符串。lexer始终会生成一个空字符串作为有效标记,从而导致无限循环

类型识别不属于lexer,而是属于解析器:

type
 : (INT | DOUBLE | BOOLEAN | ID) (OBR CBR)?
 ;

OBR     : '[';
CBR     : ']';
INT     : 'int';
DOUBLE  : 'double';
BOOLEAN : 'boolean';
ID      : ('a'..'z' | 'A'..'Z')+;

每当您开始组合不同类型的字符来创建(单个)标记时,通常最好为此创建一个解析器规则。将lexer规则(标记)视为您语言中最小的构建块。从这些构建块中,您可以编写解析器规则。

本周第二次感谢Bart:)我现在能够解决这个问题,希望它也能帮助未来的ANTLR寻求帮助者!