微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Antlr4 有没有办法在带有监听器的节点上行走

如何解决Antlr4 有没有办法在带有监听器的节点上行走

我正在使用 antlr4 来解析一些内部语言。 我这样做的方式是创建令牌流的标准方法,然后使用设置的令牌创建解析树。最后一步是创建一棵树。 现在我有一棵树,我可以使用 walk 命令遍历它。 walk 命令和正在创建的解析树是 BaseListener 类的扩展。 对于我的项目,我使用了许多前瞻,我主要使用访问者作为一种前瞻。 访问者函数可以应用于解析器树中的节点。 (假设您实现了一个访问者类) 我尝试创建一个较小的侦听器类来充当我对特定节点的展望。但是,我无法弄清楚这是否可能。 或者是否有另一种/更好/更智能的方式来创建展望?

为了使问题看起来更短: antlr4解析器树状访问者可以在节点上使用监听器类吗?

解决方法

没有真正的理由对这里的听众做任何花哨的事情。要处理解析表达式类型的示例,这可以通过几个步骤来完成。您将需要一个构建符号表的侦听器(大概是一个作用域符号表,以便解析树中的每个作用域都有一个符号表和对“父”作用域的引用,它可能会搜索以解析任何变量的数据类型。)。根据您的需要,您可以在您的侦听器中构建这些作用域符号表,在您进入/退出作用域时将它们推入和弹出堆栈,或者您可以这样做是一个单独的侦听器,将作用域节点的引用附加到您的解析树。类型解析需要此符号表,因此如果您可以在遇到声明之前引用源代码中的变量,则您还需要通过构建侦听器并保留符号表结构来传递树。

您的侦听器可以使用符号表结构来解析表达式类型。如果您始终使用 exit* 方法覆盖,则任何子表达式的所有数据类型都已被解析。对于所有子表达式类型,您可以推断您将要“退出”的表达式的类型。评估子表达式的类型应该涵盖解析表达式类型所需的所有“前瞻”。

这种方法实际上也没有任何东西可以排除访问者,您只需要访问每个孩子,确定它的类型,然后在侦听器的末尾,从类型中解析表达式类型是孩子。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。