gpt4 book ai didi

java - 如何正确实现 ANTLR4 访问者

转载 作者:行者123 更新时间:2023-12-02 03:10:27 32 4
gpt4 key购买 nike

我正在尝试为玩具语言实现一个解析器。

我已经编写了语法,但是当我尝试从 CST 创建 AST 时遇到了问题。

我定义了一个继承自 MyParserVisitor<ASTNode> 的类哪里ASTNode是一个虚拟类,我的类结构中的每个类都继承自该类。

现在,我的语法规则中有两条如下:

program:
funcDecl* expr
;
expr:
constant # constExpr
| identifier # idExpr
;

哪里funcDecl , constantidentifier是终端规则。

当我尝试实现 program 的访问者时,每当我调用函数 visit 时我必须将结果转换为正确的类型。例如:

@Override
public Program visitProgram(fopplParser.ProgramContext ctx){
// Rule: funcDecl* expr
List<FuncDecl> funcs = new LinkedList<FuncDecl>();
for(fopplParser.FuncDeclContext f : ctx.funcDecl())
funcs.add((FuncDecl) visit(f));

Expr expr = (Expr)visit(ctx.expr());
return new Program(funcs, expr);
}

是否可以以某种方式省略所有这些铸件?我觉得我在这里做错了什么。

FuncDecl为例,我可以将该行更改为 funcs.add(visitFuncDecl(f));并实现visitFuncDecl带有以下签名 pubic FuncDecl visitFuncDecl(fopplParser.FuncDeclContext ctx);但我不能用这个表达式来做到这一点,因为没有 visitExpr函数,而是两个函数,即visitConstExprvisitIdExpr .

此外,如果我有这样的规则 idList: identifier*在这种情况下,我无法返回 List<Identifier> 。我是否应该创建一个只不过是 List<Identifier> 的包装器的类? ,或者我应该直接让我的 Visitor 类继承自 MyParserVisitor<Object>

最佳答案

我认为您混淆了 ANTLR 访问者类的含义和您遍历解析树的意图。 ANTLR 访问者类用于评估。它可以被参数化以返回给定的类作为访问节点的结果(例如,计算表达式时的数学值)。要遍历解析树,请改用解析树监听器。然后,您可以覆盖 EnterXXX 和 exitXXX 函数并构建符号表或任何您喜欢的内容。

关于java - 如何正确实现 ANTLR4 访问者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41131070/

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