我希望能够解析 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
为什么空条件不起作用?
答案 0 :(得分:4)
词法分析器无法处理与空字符串匹配的标记。如果你考虑一下,这并不奇怪:毕竟,输入中有无限量的空字符串。词法分析器总是会产生一个空字符串作为有效标记,从而导致无限循环。
类型的识别不属于词法分析器,而是属于解析器:
type
: (INT | DOUBLE | BOOLEAN | ID) (OBR CBR)?
;
OBR : '[';
CBR : ']';
INT : 'int';
DOUBLE : 'double';
BOOLEAN : 'boolean';
ID : ('a'..'z' | 'A'..'Z')+;
每当您开始组合不同的类型字符来创建(单个)令牌时,通常最好为此创建解析器规则。将词法分析器(令牌)视为您语言的最小构建块。从这些构建块中,您可以撰写解析器规则。