首页 > 解决方案 > 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 不能识别整数?任何帮助表示赞赏,谢谢:)

标签: java-8antlr4

解决方案


...

INT: '0'
   | '-'? [1-9] [0-9_]*
   ;
   // no leading zeros are allowed!

...

line 1:13 mismatched input '6' expecting INT

此错误表明对于输入6,词法分析器规则INT不匹配。如果您在也匹配的规则之前定义了词法分析器规则,则可能会发生这种情况。像这样的例子:INT6

DIGIT
 : [0-9]
 ;

...

INT
 : '0'
 | '-'? [1-9] [0-9_]*
 ;

现在输入"6"(或任何单个数字)将作为DIGIT标记匹配。即使您在语法的解析器部分中有这个:

parse
 : INT
 ;

输入"6"仍将被标记为DIGIT标记:词法分析器不是由解析器“驱动”的,它按照自己的 2 个规则运行:

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

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


推荐阅读