【问题标题】:AST: what's the difference between visiting and just using query methods?AST:访问和仅使用查询方法有什么区别?
【发布时间】:2016-04-20 09:00:29
【问题描述】:

例如,我从 ASTParser 获得了一个 CompilationUnit。为什么我需要接受访问者而不是使用常规方法:

ASTParser parser ... //all that stuff

CompilationUnit unit = (CompilationUnit) parser.createAST(null);

然后我做:

unit.types() //get all type declarations

从这里开始,我只是继续沿着 AST 向下直到叶节点就像那样,而不使用访问。使用访问者模式与我建议的相比有什么优势?

【问题讨论】:

    标签: java abstract-syntax-tree eclipse-jdt


    【解决方案1】:

    访问者(ASTVisitor 的子类型)的目的是遍历整个 AST,因此您可以毫不费力地检查每个单独的 AST 节点(除非访问方法返回 false,此时当前子树下方节点被跳过)。

    当直接查询 AST 时,你负责遍历所有感兴趣的节点。

    使用unit.types() 时,您只能获得顶级类型声明,但使用访问者可以轻松处理编译单元中的所有类型,包括嵌套类型。

    如果正确实施,两种方法都应该表现出相同的行为。因此差异在于需要编写的代码量和代码的清晰度(训练有素的眼睛会立即理解访问者的用法,但需要仔细阅读手动遍历)。

    【讨论】:

    • 我明白了。手动遍历对我来说似乎更自然,更容易阅读。但是,由于代码可读性不仅意味着代码的作者应该很容易阅读它,而且对其他人来说也应该很容易,所以我正在重写我的 AST 遍历类
    • 也许作为一个经验法则:如果手动遍历是微不足道的,那没关系,甚至可能比访问者更可取,但是一旦事情变大,访问者就是规范的解决方案。由于 Java 语言很大,许多从小开始的实现在填补最初的空白和漏洞时会变得很大。
    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多