gpt4 book ai didi

ANTLR4 AST 访问者和节点返回类型 : should I have more than one visitor?

转载 作者:行者123 更新时间:2023-12-02 00:59:50 25 4
gpt4 key购买 nike

我正在尝试学习 ANTLR(使用 v4),并且我正在使用访问者来遍历 antlr 生成的 AST。

帮助我学习 - 我想出了一种愚蠢的语言来解析。它有“参议员”名单

FirstName LastName(方) 例如 BA Baracus (R)

这些填充了一个 universe(在 ArrayList() 中),您稍后可以用它来做事

...还有一些“ Action ”,例如

~printRhouse 打印出众议院(即打印出宇宙,按政党分组)

ANTLR 为我生成了一个基本访问者,它是一个参数化类 - 所以我用一个作为 T 提供的类进行了子类化 - 在他们看来,这个类是访问者中所有方法返回的内容。

Antlr 生成类似的东西

public class SenatorBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements SenatorVisitor<T> {

然后我想出了这样的具体实现。

public class InitialParseVisitor extends SenatorBaseVisitor<SenatorASTContainer> {

我发现自己编写了一个“容器”类(在本例中为 SenatorASTContainer),无法捕获树方法可返回的任何内容 - 在本例中为定义新参议员或“ Action ”的语句像“打印厂”。这感觉很糟糕,因为这个类变得非常困惑和多功能,因为它必须处理树中的每种类型的节点。

我是不是想错了? - 我是否应该有 n 个步行者,每个步行者都有一个更单一用途的返回类型,并且都设计为做一件事。这些中的每一个都会通过选择不访问它们来忽略不同类型的节点。

然后将 AST 遍历 n 次,每次使用不同的 walker 来嗅探不同的东西,最后根据多次运行的输出将最终程序组合在一起。

如果不是,并且一种 walker 类型通常就足够了,那么当我有不同类型的节点时,我应该如何考虑方法的返回类型?

最佳答案

拥有多个访问者并不能解决问题:实际上,每个具有重要语法的规则都会有自己的访问者(和结果节点)。生成的代码将难以维护。

我认为最常见的方法是使用 SenatorASTContainer 作为所有生成的 AST 节点的父类(super class):

FirstNameLastNameParty 可能是 StringNode extends SenatorASTContainer 并且其中一行的类型是 Senator 扩展了 SenatorASTContainer。然而,Senator 的访问者必须将较低节点的结果转换为 StringNode(访问者将只返回通用的 SenatorASTContainer)。

关于ANTLR4 AST 访问者和节点返回类型 : should I have more than one visitor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29929062/

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