[英]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
是可以与您的所有规则匹配的令牌: DIGIT
, Integer
和Number
。 请注意,由于它们的名称以大写字母开头,因此它们全部都是词法分析器规则。
为了消除歧义,ANTLR首先选择可以匹配规则的最长令牌,然后在剩下多个规则时选择第一个 。
因此,在您的情况下, 1
产生DIGIT
令牌,但是您的语法要求使用Number
,如错误消息所示。
我认为您打算使用片段 ,这些片段不是独立的词法分析器规则,而是可重用的语法部分:
fragment DIGIT
: '0'..'9'
;
fragment INTEGER
: DIGIT+
;
NUMBER
: Integer (DOT Integer)?
;
有了这种语法,您所有的号码将始终为NUMBER
令牌类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.