我正在使用antlr4来解析一些内部语言。我这样做的方式是创建一个令牌流,然后用设置的令牌创建一个解析树的标准方式。最后一步是创建一棵树。现在我有了一棵树,我可以使用walk
命令遍历它。walk命令和正在创建的解析树是BaseListener类的扩展。对于我的项目,我使用了许多前瞻性广告,我主要使用访问者作为一种前瞻性广告。访问者函数可以应用于解析器树中的节点。(假设您实现了访问者类(我尝试创建一个较小的监听器类,作为我对特定节点的展望。然而,我不知道这是否可能。或者还有其他/更好/更聪明的方式来创造未来?
为了使问题看起来更短:监听器类是否可以像visitor一样在antlr4解析器树中的节点上使用?
这里没有真正的理由对侦听器做任何花哨的事情。要处理解析表达式类型的示例,可以通过几个步骤来完成。你需要一个监听器来构建一个符号表(可能是一个作用域符号表,这样解析树中的每个作用域都有一个符号表格和对它可能搜索的"父"作用域的引用,以解析任何变量的数据类型。(。根据你的需要,你可以在监听器中构建这些作用域符号表格,在进入/退出作用域时将它们推送并弹出堆栈,或者,您可以通过一个单独的监听器将对作用域节点的引用附加到解析树中来实现这一点。该符号表是类型解析所必需的,因此,如果您可以在遇到声明之前引用源中的变量,那么您也需要通过侦听器构建并保留符号表结构来传递树。
使用侦听器可用于解析表达式类型的符号表结构。如果始终使用exit*
方法重写,则任何子表达式的所有数据类型都将已解析。使用所有的子表达式类型,可以推断出要"退出"的表达式的类型。计算子表达式的类型应该涵盖解析表达式类型所需的所有"前瞻性"。
这种方法实际上也没有排除访问者的可能性,它只取决于你访问每个孩子,确定它的类型,然后在监听器结束时,从它的孩子的类型中解析表达式类型。