引用在ANTLR4中调用规则侦听器时解析器所处的位置

时间:2019-01-14 15:43:52

标签: parsing compiler-construction antlr antlr4 parser-generator

我正在用Python生成侦听器,但是任何语言都可以用作答案或评论。

我需要知道在解析树中是否有对位置的引用,或者甚至更好的是,在令牌流中或在源文件中 strong>调用特定的侦听器方法时,解析器位于
我得到一个上下文对象,该对象具有对解析器本身的引用,我在寻找它,但似乎找不到任何对象。
这仅用于调试。

def enterData_stmt(self, ctx:fassParser.Data_stmtContext):

我知道解析器不会遍历源文件,而是遍历抽象语法树,我可以查看它并获得解析器所在的位置,但是我想知道是否可以获取一些上下文快速调试而无需遍历树

1 个答案:

答案 0 :(得分:0)

每个ParseRuleContext对象都具有字段startstop,它们分别包含该规则匹配的第一个和最后一个标记。令牌对象具有方法getLinegetCharPositionInLine来找出每个令牌分别在其开始的行号和列号(没有方法可以告诉您令牌在何处结束(除了绝对索引,-行和列号),因此如果需要,您需要使用开始位置和长度自己计算)。

  

我知道解析器不会遍历源文件,而是遍历抽象语法树

当然,解析器会遍历源文件-它将如何解析源文件?解析器遍历源文件以生成(不是很抽象)解析树。如果您正在使用访问者或将ParseTreeWalker与侦听器一起使用,则访问者/侦听器将遍历生成的解析树。如果您使用的是addParseListener,则在解析器仍在解析文件时,将使用部分构造的树来调用侦听器。