作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在这个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/
在这个SO问题的帮助下How to create AST with ANTLR4?我能够创建 AST 节点,但我一直在编码 BuildAstVisitor如已接受答案的示例中所示。 我有一个这样开头的
我是一名优秀的程序员,十分优秀!