我“继承”了一个使用JavaCC中的JJTree实现简单语言解析器的项目。由于代码已超过5年,我决定在进行任何实际开发之前将所有依赖项(包括JavaCC)更新到最新版本。
因此,我删除了JJTree / JavaCC生成的所有文件,并使用最新版本(5.0)重建它们。但是,生成的文件似乎错过了先前存在的字段和方法,并且代码不再编译。
我认为JavaCC中的某些内容发生了变化,需要我更新语法文件,因此我尝试了当前JavaCC发行版中的Interpretter
示例,结果相同:缺少不允许代码的类字段编译。
例如,以下是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的经验,所以我希望有任何提示来解决这个问题。
答案 0 :(得分:1)
缺少的东西可能是由原始开发人员编辑的。这并不一定表明JavaCC或JJTree中发生了某些变化。那些是比较成熟的项目。
这里希望原件被检入版本控制系统或备份,以便您可以获取代码。也许删除和重新编译的决定并不是最好的。
答案 1 :(得分:1)
编辑生成的节点文件是一种非常标准的做法......但是不应该更改解析器文件和令牌管理器;这就是TOKEN_MGR_DECLS和语法文件中的代码。
人们编辑这些文件的原因是他们不会经常改变...虽然当然这样做但是有点痛苦。