我试图解析字符串"定义一个: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能够识别带小数点的数字,但不能识别没有小数点的整数。
有人能发现我做错了吗?
答案 0 :(得分:1)
你的词法分析器规则含糊不清。
1
是一个令牌,可以通过所有规则进行匹配:DIGIT
,Integer
和Number
。请注意,它们中的所有3个都是词法规则,因为它们的名称以大写字母开头。
为了消除歧义,ANTLR首先选择可以匹配规则的最长令牌,当剩下几个规则时,它会选择第一个。
因此,在您的情况下,1
会产生DIGIT
令牌,但您的语法需要Number
,如错误消息所示。
我认为你打算做的是使用片段,它们不是独立的词法分析器规则,而是可重复使用的语法部分:
fragment DIGIT
: '0'..'9'
;
fragment INTEGER
: DIGIT+
;
NUMBER
: Integer (DOT Integer)?
;
使用此语法,您的所有数字将始终为NUMBER
令牌类型。