ANTLR4 AST 创建 - 如何创建 AstVistor

ANTLR4 AST Creation - How to create an AstVistor

在这个 SO 问题的帮助下 我能够创建 AST 节点,但我仍然坚持按照已接受答案示例中的描述对 BuildAstVisitor 进行编码。

我的语法是这样开头的:

mini: (constDecl | varDef | funcDecl | funcDef)* ;

而且我也不能为块分配标签(antlr4说label X assigned to a block which is not a set),我不知道如何访问下一个节点

public Expr visitMini(MiniCppParser.MiniContext ctx) {
    return visitConstDecl(ctx.constDecl());
}

上面的代码存在以下问题:我不知道如何确定它是 constDeclvarDef 还是任何其他选项以及 ctx.constDecl() returns a List<ConstDeclContext> 而我只需要一个元素用于 visitConstDecl 函数。

编辑:

更多语法规则:

mini: (constDecl | varDef | funcDecl | funcDef)* ;

//--------------------------------------------------

constDecl:   'const' type ident=ID init ';' ;
init:        '=' ( value=BOOLEAN | sign=('+' | '-')? value=NUMBER ) ;
// ...

//--------------------------------------------------

OP_ADD: '+';
OP_SUB: '-';
OP_MUL: '*';
OP_DIV: '/';
OP_MOD: '%';

BOOLEAN        : 'true' | 'false' ;
NUMBER         : '-'? INT ;
fragment INT   : '0' | [1-9] [0-9]* ;
ID             : [a-zA-Z]+ ;
// ...

我仍然不完全确定如何实施 BuildAstVisitor。我现在有以下内容,但对我来说肯定不正确...

@Override
public Expr visitMini(MiniCppParser.MiniContext ctx) {
  for (MiniCppParser.ConstDeclContext constDeclCtx : ctx.constDecl()) {
    visit(constDeclCtx);
  }
  return null;
}

@Override
public Expr visitConstDecl(MiniCppParser.ConstDeclContext ctx) {
  visit(ctx.type());
  return visit(ctx.init());
}

如果您想获取各个子规则,请为它们实现 visitXXX 函数(visitConstDecl()visitVarDef() 等)而不是 visitMini() 函数。只有在输入中确实匹配它们时才会调用它们。因此,您无需对事件进行任何检查。