java-8 - ANTLR4 无法识别规则
问题描述
在我的 g4 文件中,我定义了一个整数,如下所示:
INT: '0'
| '-'? [1-9] [0-9_]*
;
// no leading zeros are allowed!
解析器规则这样使用:
versionDecl: PACK_VERSION_DECL INT;
但是,当 ANTLR 遇到一个时,它无法识别它,并且如果我运行则抛出 NullPointerException ctx.INT().getText()
:
@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)。
推荐阅读
- visual-studio - VS2019 Live Share - 是否也可以共享控制台?
- java - 通过进行数据库调用来存根/模拟方法的问题
- java - 从外部类更改 TabbedPane 索引
- google-apps-script - 使用从谷歌表格中提取的数据从模板创建谷歌文档文档
- android - 集成使用 Kotlin Coroutines 依赖问题构建的库模块
- python - 使用 PySoundFile,如何获取字节缓冲区?
- r - 如何在 R 中更改 mrset 的列名?
- r - 如何编写一个 for 循环来从包含 NA 的数据集中计算模型残差?
- java - 我的 Exomedia 代码在某些设备上不起作用,我该如何解决?
- php - 如何将从数据库中随机选择的图像放置在页面上的随机位置?