如何解决为什么我的 antlr 语法给我一个错误?
我有下面的小语法。 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
;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。