3

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

考虑以下语法:

TYPE    :   'int' AFTERINT;
AFTERINT:   '[' ']';

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

AFTERINT:   '[' ']' |
              |;

但是现在我收到了这个警告和错误:

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

因此,对于该输入 [13:34:08] 错误(201):MiniJava.g:5:9:以下备选方案永远无法匹配:3

为什么空条件不起作用?

4

1 回答 1

4

词法分析器无法处理匹配空字符串的标记。如果您仔细考虑一下,这并不奇怪:毕竟,您的输入中有无数个空字符串。词法分析器总是会产生一个空字符串作为有效标记,从而导致无限循环。

类型的识别不属于词法分析器,而属于解析器:

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

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

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

于 2012-11-08T13:23:35.197 回答