使用ANTLR4生成的访问者生成AST

使用ANTLR4生成的访问者生成AST,antlr,antlr4,Antlr,Antlr4,我正在将ANTLR3语法转换为ANTLR4语法,这意味着我必须删除所有树重写规则,因为它们现在必须在代码中实现,通过使用自定义的访问者访问ParseTree,可以生成AST 旧语法具有防止歧义的重写规则,并自动生成通缉目录树。我在网上找不到任何有用的资源来展示如何使用访问者/监听器范例来实现这一点 Visitor需要一个类型,该类型用作所有visit*函数的返回类型。如果我需要生成AST,我应该使用什么返回类型?ANTLR3使用了CommonTree对象 当输入visit*节点时,我可以创建树的

我正在将ANTLR3语法转换为ANTLR4语法,这意味着我必须删除所有树重写规则,因为它们现在必须在代码中实现,通过使用自定义的
访问者访问
ParseTree
,可以生成AST

旧语法具有防止歧义的重写规则,并自动生成通缉目录树。我在网上找不到任何有用的资源来展示如何使用访问者/监听器范例来实现这一点

  • Visitor
    需要一个类型,该类型用作所有
    visit*
    函数的返回类型。如果我需要生成AST,我应该使用什么返回类型?ANTLR3使用了
    CommonTree
    对象
  • 当输入
    visit*
    节点时,我可以创建树的节点,但我应该如何跟踪其父节点
  • 有没有关于如何将树重写规则转换为生成AST节点的方法的示例?如果没有,是否可以为下面这样的规则提供一个示例
  • 以下是第(3)条的规则:


    按照习惯,Antlr4创建并支持使用解析树。不直接支持创建和修改AST

    与AST相比,更喜欢解析树的一些动机因素如下


    Antlr4并不排除构建AST——该结构可以以任何所需的方式定义。一些示例是和。

    感谢您提供的链接,但是其他问题中没有介绍
    (3)
    ,因为它们都假设创建新语法而不是转换antlr3语法规则。是的。网络上任何地方都没有(3)所述的例子,这就很好地说明了这条路径的使用频率。
    ctor_initializer: '::'? identifier '(' expr? ')' -> ^(CTOR_INITIALIZER^(INITIALIZER_ID '::'? identifier) ^(CTOR_EXPR expr?) );