如何解决ANTLR4 无法识别规则
INT: '0'
| '-'? [1-9] [0-9_]*
;
// no leading zeros are allowed!
解析器规则像这样使用:
versionDecl: PACK_VERSION_DECL INT;
但是,当 ANTLR 遇到一个时,它无法识别它,并且如果我运行 ctx.INT().getText()
则抛出 NullPointerException:
@Override
public void exitVersionDecl(VersionDeclContext ctx) {
System.out.println(ctx.INT().getText());
}
日志:
line 1:13 mismatched input '6' expecting INT
[...]
java.lang.NullPointerException
at com.blockypenguin.mcfs.MCFSCustomListener.exitVersionDecl(MCFSCustomListener.java:16)
at main.antlr.MCFSParser$VersionDeclContext.exitRule(MCFSParser.java:604)
at org.antlr.v4.runtime.tree.ParseTreeWalker.exitRule(ParseTreeWalker.java:47)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:30)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:28)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:28)
at com.blockypenguin.mcfs.Main.main(Main.java:40)
(为简洁起见省略了不相关的输出)
最后,我正在解析的输入:
pack_version 6
为什么 ANTLR 不能识别整数?感谢任何帮助,谢谢:)
解决方法
...
INT: '0'
| '-'? [1-9] [0-9_]*
;
// no leading zeros are allowed!
...
line 1:13 mismatched input '6' expecting INT
此错误表示对于输入 6
,词法分析器规则 INT
不匹配。如果您在 INT
规则也匹配 6
之前定义了一个词法分析器规则,就会发生这种情况。像这样例如:
DIGIT
: [0-9]
;
...
INT
: '0'
| '-'? [1-9] [0-9_]*
;
现在输入的 "6"
(或任何单个数字)将作为 DIGIT
标记匹配。即使你在语法的解析器部分有这个:
parse
: INT
;
输入 "6"
仍将被标记为 DIGIT
标记:词法分析器不是由解析器“驱动”的,它根据自己的 2 条规则运行:
- 尝试为单个词法分析器规则匹配尽可能多的字符
- 如果 2 个或多个词法分析器规则匹配相同数量的字符,则让第一个定义的规则“获胜”
因此,输入 "12"
将被标记为 INT
标记(规则 1 在这里适用),输入 "0"
被标记为 DIGIT
标记(规则 2 ).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。