我“继承”了一个项目,该项目使用JavaCC的 JJTree来实现一个简单的语言解析器。由于代码已经超过 5 年,我决定在进行任何实际开发之前将所有依赖项(包括 JavaCC)更新到最新版本。
因此,我删除了所有由 JJTree/JavaCC 生成的文件,并使用最新版本(5.0)重新构建它们。但是,生成的文件似乎缺少以前存在的字段和方法,并且代码不再编译。
我假设 JavaCC 中发生了一些变化,需要我更新语法文件,所以我尝试了Interpretter
当前 JavaCC 发行版中的示例,结果相同:缺少不允许代码编译的类字段。
例如,以下是示例的SPL.jjt
定义Interpretter
:
void Id() :
{
Token t;
}
{
t = <IDENTIFIER> { jjtThis.name = t.image; }
}
此示例的文件夹包含一个ASTId.java
最初具有以下内容的文件:
public class ASTId extends SimpleNode {
String name;
public ASTId(int id) {
super(id);
}
public ASTId(SPLParser p, int id) {
super(p, id);
}
public void interpret()
{
stack[++top] = symtab.get(name);
}
}
重新生成AST*.java
文件后,内容发生了变化:
public class ASTId extends SimpleNode {
public ASTId(int id) {
super(id);
}
public ASTId(SPLParser p, int id) {
super(p, id);
}
}
这里缺少很多内容,因此SPLParser.java
生成的文件无法编译,因为它使用了相应类中未定义的字段。
我错过了什么?是否有我必须使用的 JJTree 或 JavaCC 选项?也许在语法文件中进行修改?或者,由于我真的不知道原始文件是否已被编辑,我是否应该直接修改生成的文件并手动添加缺失的位?
我没有使用 JavaCC 的经验,因此我将不胜感激任何解决此问题的提示。