ANTLR 4.5.2 无法识别数字令牌

ANTLR 4.5.2 not recognizing Number token

我正在尝试使用以下简单演示 class 来解析字符串 "define one: 1.":

public class ANTLRDemo {
    public static void main(String[] args)  {
        AremelleLexer lexer = new AremelleLexer(new ANTLRInputStream("define one: 1."));
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        AremelleParser parser = new AremelleParser(tokens);
        ProgramContext p = parser.program();
    }
}

但是,我将 运行 保存到此错误消息中:

line 1:12 mismatched input '1' expecting {'define', '{', Identifier, Number, String}

相关语法为:

DIGIT
:   '0'..'9'
;

Integer
:   DIGIT+
;

Number
:   Integer (DOT Integer)?
;

为什么“1”没有被识别为数字?

一个有趣的注意事项是字符串 "define one: 1.0." 解析得很好,因此 ANTLR 能够识别带小数点的数字,但不能识别没有小数点的整数。

有人能发现我做错了什么吗?

您的词法分析器规则不明确。

1 是一个标记,可以与您的 所有 规则匹配:DIGITIntegerNumber .请注意,所有 3 个都是词法分析器规则,因为它们的名称以大写字母开头。

为了消除歧义,ANTLR 首先选择可以匹配规则的最长标记,当剩下几个规则时,它选择第一个

所以在你的情况下,1 产生一个 DIGIT 标记,但你的语法需要一个 Number,正如错误消息所说。

认为您打算做的是使用片段,它们不是独立的词法分析器规则,而是可重用的语法部分:

fragment DIGIT
:   '0'..'9'
;

fragment INTEGER
:   DIGIT+
;

NUMBER
:   Integer (DOT Integer)?
;

使用此语法,您的所有数字将始终为 NUMBER 标记类型。