<;EOF>;在ANTLR 4中有点奇怪?

<;EOF>;在ANTLR 4中有点奇怪?,antlr,antlr4,antlr3,Antlr,Antlr4,Antlr3,我正在尝试ANTLR 4,它为《权威ANTLR 4参考》一书中简单的Hello语法提供了以下输出: [@2,12:11='<EOF>',<-1>,2:0] [@2,12:11='',2:0] 根据本书的解释,12:11符号表示标记从位置12开始,到11结束。这怎么可能呢 另外,我正在Windows上工作。在ANTLR 4中,两个端点都包含在内。包含端点的跨度长度如下所示: 长度=结束-开始+1 EOF符号的长度为0(它出现在已知位置,但不包含输入符号)。如果输入长度为

我正在尝试ANTLR 4,它为《权威ANTLR 4参考》一书中简单的
Hello
语法提供了以下输出:

[@2,12:11='<EOF>',<-1>,2:0]
[@2,12:11='',2:0]
根据本书的解释,
12:11
符号表示
标记从位置
12
开始,到
11
结束。这怎么可能呢


另外,我正在Windows上工作。

在ANTLR 4中,两个端点都包含在内。包含端点的跨度长度如下所示:

长度=结束-开始+1

EOF符号的长度为0(它出现在已知位置,但不包含输入符号)。如果输入长度为12个字符,则得到以下结束位置公式:

0=结束-12+1

因此:

结束=0+12-1=11


也许它是以字节为单位的,使用UTF-16编码?谢谢。所以我试图理解这背后的动机。我的猜测是,这个符号很特别,因为它只是一个隐含的概念符号,没有物理长度。ANTLR尝试标识其位置,同时将其长度保持为0。正常物理符号的长度计算为
结束-开始+1
。ANTLR想要保留这个公式。因此,对于像这样的概念符号,它必须故意使
结束小于开始1
。通过这种方式,ANTLR实现了概念符号类的零长度和通用长度公式。