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条规则操作:

  1. 尝试为单个词法分析器规则匹配尽可能多的字符
  2. 如果两个或多个词法分析器规则匹配相同数量的字符,让规则先定义"win">

因此,输入"12"将被标记为INT令牌(规则1适用于此),输入"0"将被标记为DIGIT令牌(规则2)。

相关内容

  • 没有找到相关文章

最新更新