gpt4 book ai didi

java - ANTLR4 AST 创建 - 如何创建 AstVistor

转载 作者:行者123 更新时间:2023-12-02 13:09:57 31 4
gpt4 key购买 nike

在这个SO问题的帮助下How to create AST with ANTLR4?我能够创建 AST 节点,但我一直在编码 BuildAstVisitor如已接受答案的示例中所示。

我有一个这样开头的语法:

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

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

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

上面的代码有以下问题:我不知道如何判断它是否是constDecl , varDef或任何其他选项和 ctx.constDecl()返回 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 () 函数。仅当输入中确实存在匹配项时才会调用它们。因此,您不需要对发生的情况进行任何检查。

关于java - ANTLR4 AST 创建 - 如何创建 AstVistor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44003999/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com