在这个问题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());
}
我在上面的代码中遇到以下问题:我不知道如何判断它是constDecl
,varDef
还是任何其他选项,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
答案 0 :(得分:1)
如果您想获得各个子规则,请为它们(visitConstDecl()
,visitVarDef()
等)而不是visitMini()
函数实现visitXXX函数。只有在输入中与它们匹配时才会调用它们。因此,您不需要对出现的情况进行任何检查。