0

我“继承”了一个项目,该项目使用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 的经验,因此我将不胜感激任何解决此问题的提示。

4

2 回答 2

1

缺少的东西可能是由原始开发人员编辑的。这不一定表示 JavaCC 或 JJTree 发生了变化。这些都是比较成熟的项目。

这里希望原始文件被检入版本控制系统或备份,以便您可以取回代码。也许删除和重新编译的决定并不是最好的。

于 2011-03-20T21:22:32.137 回答
1

编辑生成的节点文件是一种非常标准的做法……但不应更改解析器文件和令牌管理器;这就是 TOKEN_MGR_DECLS 和语法文件中的代码的用途。

人们编辑这些文件的原因是它们不会经常更改......当然,当他们这样做时,会有点痛苦。

于 2011-03-22T02:12:33.707 回答