繁体   English   中英

ANTLR 4.5.2无法识别数字令牌

[英]ANTLR 4.5.2 not recognizing Number token

我试图解析字符串“ 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();
    }
}

但是,我一直遇到此错误消息:

第1:12行输入“ 1”不匹配,期望{'define','{',标识符,数字,字符串}

相关的语法是:

DIGIT
:   '0'..'9'
;

Integer
:   DIGIT+
;

Number
:   Integer (DOT Integer)?
;

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

一个有趣的注释是字符串“ define one:1.0”。 解析很好,因此ANTLR能够识别带小数点的数字,但不能识别没有小数点的整数。

有人可以发现我在做什么吗?

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

1是可以与您的所有规则匹配的令牌: DIGITIntegerNumber 请注意,由于它们的名称以大写字母开头,因此它们全部都是词法分析器规则。

为了消除歧义,ANTLR首先选择可以匹配规则的最长令牌,然后在剩下多个规则时选择第一个

因此,在您的情况下, 1产生DIGIT令牌,但是您的语法要求使用Number ,如错误消息所示。

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

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

fragment INTEGER
:   DIGIT+
;

NUMBER
:   Integer (DOT Integer)?
;

有了这种语法,您所有的号码将始终为NUMBER令牌类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM