我正在用Python生成侦听器,但是任何语言都可以用作答案或评论。
我需要知道在解析树中是否有对位置的引用,或者甚至更好的是,在令牌流中或在源文件中 strong>调用特定的侦听器方法时,解析器位于。
我得到一个上下文对象,该对象具有对解析器本身的引用,我在寻找它,但似乎找不到任何对象。
这仅用于调试。
def enterData_stmt(self, ctx:fassParser.Data_stmtContext):
我知道解析器不会遍历源文件,而是遍历抽象语法树,我可以查看它并获得解析器所在的位置,但是我想知道是否可以获取一些上下文快速调试而无需遍历树
答案 0 :(得分:0)
每个ParseRuleContext
对象都具有字段start
和stop
,它们分别包含该规则匹配的第一个和最后一个标记。令牌对象具有方法getLine
和getCharPositionInLine
来找出每个令牌分别在其开始的行号和列号(没有方法可以告诉您令牌在何处结束(除了绝对索引,-行和列号),因此如果需要,您需要使用开始位置和长度自己计算)。
我知道解析器不会遍历源文件,而是遍历抽象语法树
当然,解析器会遍历源文件-它将如何解析源文件?解析器遍历源文件以生成(不是很抽象)解析树。如果您正在使用访问者或将ParseTreeWalker
与侦听器一起使用,则访问者/侦听器将遍历生成的解析树。如果您使用的是addParseListener
,则在解析器仍在解析文件时,将使用部分构造的树来调用侦听器。