ANTLR:空状态不起作用

时间:2012-11-08 12:35:23

标签: antlr

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

考虑以下语法:

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

当然可行,但仅适用于 int [] 。为了使其适用于 int ,我将AFTERINT更改为此(添加了空条件':

AFTERINT:   '[' ']' |
              |;

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

  

[13:34:08]警告(200):MiniJava.g:5:9:决定可以匹配输入   例如“”使用多种替代方案:2,3

     

结果,替代品(s)3因输入被禁用[13:34:08]   错误(201):MiniJava.g:5:9:以下替代方案永远不可能   匹配:3

为什么空条件不起作用?

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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