缺少JavaCC / JJTree节点类中的字段?

时间:2011-03-20 21:19:40

标签: java javacc

我“继承”了一个使用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的经验,所以我希望有任何提示来解决这个问题。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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