ANTLR 4.5.2无法识别号码令牌

时间:2016-03-03 15:55:06

标签: parsing antlr grammar

我试图解析字符串"定义一个: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'期待{'定义',' {',标识符,数字,字符串}

相关语法是:

DIGIT
:   '0'..'9'
;

Integer
:   DIGIT+
;

Number
:   Integer (DOT Integer)?
;

为什么" 1"不被认可为号码?

一个有趣的说明是字符串"定义一个:1.0。"解析很好,因此ANTLR能够识别带小数点的数字,但不能识别没有小数点的整数。

有人能发现我做错了吗?

1 个答案:

答案 0 :(得分:1)

你的词法分析器规则含糊不清。

1是一个令牌,可以通过所有规则进行匹配:DIGITIntegerNumber。请注意,它们中的所有3个都是词法规则,因为它们的名称以大写字母开头。

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

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

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

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

fragment INTEGER
:   DIGIT+
;

NUMBER
:   Integer (DOT Integer)?
;

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