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());
}
上面的代码存在以下问题:我不知道如何确定它是 constDecl
、varDef
还是任何其他选项以及 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()
函数。只有在输入中确实匹配它们时才会调用它们。因此,您无需对事件进行任何检查。
在这个 SO 问题的帮助下 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());
}
上面的代码存在以下问题:我不知道如何确定它是 constDecl
、varDef
还是任何其他选项以及 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()
函数。只有在输入中确实匹配它们时才会调用它们。因此,您无需对事件进行任何检查。