Parsing 获取表达式';s在正在分析的文本中的位置和长度

Parsing 获取表达式';s在正在分析的文本中的位置和长度,parsing,antlr,antlr4,antlr3,Parsing,Antlr,Antlr4,Antlr3,在我的ANTLR生成的解析器执行时,我想引发一个事件,其中包含正在计算的表达式的位置和长度,以便在文本编辑器中突出显示该区域 ANTLR是否提供任何获取该信息的方法(表达式在被解析文档中的位置和长度)?您可以使用expression.getStart()获取表达式的第一个标记,然后使用.getLine()和getCharPositionInLine()分别获取行号和列号 要获得长度,可以从最后一个标记的停止索引中减去第一个标记的开始索引,然后加1(因为两个索引都包含在内,所以长度为1的表达式将具

在我的ANTLR生成的解析器执行时,我想引发一个事件,其中包含正在计算的表达式的位置和长度,以便在文本编辑器中突出显示该区域


ANTLR是否提供任何获取该信息的方法(表达式在被解析文档中的位置和长度)?

您可以使用
expression.getStart()
获取表达式的第一个标记,然后使用
.getLine()
getCharPositionInLine()
分别获取行号和列号

要获得长度,可以从最后一个标记的停止索引中减去第一个标记的开始索引,然后加1(因为两个索引都包含在内,所以长度为1的表达式将具有相同的开始索引和停止索引,指向构成表达式的单个字符)


请注意,
expression.getText().length()
更明显的解决方案是在长度中不包含跳过的标记。

因此有一个相应的expression.getStop()方法?@SongWatcher是的,第一个标记有
getStart()
,最后一个标记有
getStop()
。您可以找到所有可用的方法(除了从语法生成的方法)。因此,如果我理解了一些事情,ANTLR将使用我的语法文件生成一个解析器,该解析器实现了访问者模式的一个版本,并提供了接受语法中定义的各种表达式的方法。每个表达式将自动拥有这些getStart()和getStop()方法?@SongWatcher Right。更准确地说:根据您的语法,ANTLR将生成构成解析树的FooContext类,一个可用于创建此类解析树的解析器类,以及可用于遍历此类树的侦听器和/或访问者基类。树中的每个分支(即解析表达式时的每个表达式和子表达式)都将是这样一个生成类的实例,它将在
ParserRuleContext
上提供所有方法。Sepp2k,非常感谢您给出了超出我预期的答案。