问题描述
我有下面的小语法。 node
是开始生产。当我的输入是 (a:b)
时,我收到一个错误:line 1:1 extraneous input 'a' expecting {':',INAME}
这是为什么?
编辑 - 我忘记了词法分析器和解析器作为单独的阶段运行。到解析器运行时,词法分析器已经完成。当词法分析器运行时,它不知道解析器规则。它已经根据@bart 的以下推理做出了选择 TYPE 的 TYPE/INAME 决定。
grammar g1;
TYPE: [A-Za-z_];
INAME: [A-Za-z_];
node: '(' namesAndTypes ')';
namesAndTypes:
INAME ':' TYPE
| ':' TYPE
| INAME
;
解决方法
那是因为词法分析器永远不会产生 INAME
标记。词法分析器的作用如下:
- 尽量匹配尽可能多的字符
- 当 2 个或多个词法分析器规则匹配相同的字符时,让第一个定义的“获胜”
因为输入 "a"
和 "b"
都匹配 TYPE
和 INAME
规则,TYPE
规则获胜,因为它首先被定义。解析器是否尝试匹配 INAME
规则并不重要,词法分析器不会生成它。词法分析器不会“听”解析器。
您可以创建某种 ID
规则,然后定义 type
和 iname
解析器规则:
ID: [A-Za-z_];
node
: '(' namesAndTypes ')'
;
namesAndTypes
: iname ':' type
| ':' type
| iname
;
type
: ID
;
iname
: ID
;