ANTLR4 AST创建 - 如何创建AstVistor

时间:2017-05-16 14:16:15

标签: java antlr4 abstract-syntax-tree

在这个问题How to create AST with ANTLR4?的帮助下,我能够创建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()返回{{1}而我只需要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

1 个答案:

答案 0 :(得分:1)

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