我使用生成抽象语法树的JavaCC和JJtree编写了一个扫描程序和解析器,然后我为树中的每个节点编写了一个带有Visitor对象的PrintVisitor类。但是,在通过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)
导致错误,我该如何解决?
答案 0 :(得分:1)
事实证明,问题源于在对原始jjt文件和/或PrintVisitor类进行更改之后使用来自JJtree和JavaCC的先前生成的文件。感谢@Theodore Norvell指出这一点。
正如JJtree参考文档,here所说,
JJTree为访客设计模式提供了一些基本支持。如果VISITOR选项设置为true,JJTree将插入一个jjtAccept() 方法进入它生成的所有节点类,并生成一个 可以实现并传递给节点的访问者界面 接受。
访客界面的名称是通过追加访客来构建的 到解析器的名称。每次都重新生成接口 运行JJTree,以便它准确地表示节点集 解析器使用的。这将导致编译时错误 尚未针对新节点更新实现类。
为了避免像我这样的问题,我建议创建一个只包含.jjt文件和Visitor类的全新目录,然后在这些目录上运行JJtree和JavaCC。据我所知,很容易错过删除一个或两个旧文件,然后没有任何正常工作。