gpt4 book ai didi

java - 将访问者模式与 JavaCC 和 JJtree 结合使用

转载 作者:太空宇宙 更新时间:2023-11-04 06:35:05 37 4
gpt4 key购买 nike

我使用 JavaCC 和 JJtree 编写了一个扫描器和解析器,生成一个抽象语法树,然后编写了一个 PrintVisitor 类,其中为树中的每个节点都有一个 Visitor 对象。但是,通过JJtree和JavaCC运行jjt文件后,Java编译器给了我这个错误:

PrintVisitor.java:1: error: PrintVisitor is not abstract and does not override
abstract method visit(Command, Object) in GrammarVisitor

读者会注意到,只有一个访问者对象导致了此错误,即使我有许多其他访问者对象以完全相同的方式为树中的其他节点实现。为什么只有

visit(Command, Object) 

导致错误,如何修复?

最佳答案

事实证明,问题源于在对原始 jjt 文件和/或 PrintVisitor 类进行更改后使用之前从 JJtree 和 JavaCC 生成的文件。感谢@Theodore Norvell 指出了这一点。

作为JJtree引用文档,找到here ,说,

JJTree provides some basic support for the visitor design pattern. If the VISITOR option is set to true JJTree will insert an jjtAccept() method into all of the node classes it generates, and also generate a visitor interface that can be implemented and passed to the nodes to accept.

访客界面的名称是通过追加Visitor来构造的 解析器的名称。每次都会重新生成界面 JJTree 运行,以便它准确地表示节点集 由解析器使用。如果以下情况,这将导致编译时错误 尚未更新新节点的实现类。

为了避免像我这样的问题,我建议创建一个仅包含 .jjt 文件和 Visitor 类的全新目录,然后在这些目录上运行 JJtree 和 JavaCC。据我所知,令人惊讶的是,很容易错过删除一两个旧文件,然后就无法正常工作。

关于java - 将访问者模式与 JavaCC 和 JJtree 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25517787/

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