【问题标题】:reference to where the parser is at when calling a rule listener in ANTLR4在 ANTLR4 中调用规则侦听器时引用解析器所在的位置
【发布时间】:2019-01-14 15:43:51
【问题描述】:

我正在用 Python 生成侦听器,但任何语言都可以用于答案或 cmets。

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

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

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

【问题讨论】:

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


    【解决方案1】:

    每个ParseRuleContext 对象都有startstop 字段,分别包含规则匹配的第一个和最后一个标记。标记对象具有getLinegetCharPositionInLine 方法来找出每个标记分别开始的行号和列号(没有方法告诉您标记在哪里结束(除了作为绝对索引 - 不是行和列number),所以如果需要,你需要自己使用起始位置和长度来计算)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 2020-03-30
      相关资源
      最近更新 更多