Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaCC/JJTree节点类中缺少字段?_Java_Javacc - Fatal编程技术网

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

JavaCC/JJTree节点类中缺少字段?,java,javacc,Java,Javacc,我“继承”了一个使用JJTree实现简单语言解析器的项目。由于代码已经有5年多的历史,我决定在进行任何实际开发之前,将所有依赖项(包括JavaCC)更新到最新版本 因此,我删除了JJTree/JavaCC生成的所有文件,并使用最新版本(5.0)来重建它们。然而,生成的文件似乎遗漏了以前存在的字段和方法,代码不再编译 我假设JavaCC中发生了一些变化,需要我更新语法文件,因此我尝试了当前JavaCC发行版中的解释器示例,结果相同:缺少不允许代码编译的类字段 例如,下面是来自解释器示例的SPL.j

我“继承”了一个使用JJTree实现简单语言解析器的项目。由于代码已经有5年多的历史,我决定在进行任何实际开发之前,将所有依赖项(包括JavaCC)更新到最新版本

因此,我删除了JJTree/JavaCC生成的所有文件,并使用最新版本(5.0)来重建它们。然而,生成的文件似乎遗漏了以前存在的字段和方法,代码不再编译

我假设JavaCC中发生了一些变化,需要我更新语法文件,因此我尝试了当前JavaCC发行版中的
解释器
示例,结果相同:缺少不允许代码编译的类字段

例如,下面是来自
解释器
示例的
SPL.jjt
的定义:

void Id() :
{
   Token t;
}
{
   t = <IDENTIFIER>  { jjtThis.name = t.image; }
}
在我重新生成
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的经验,因此如果有任何提示可以解决这个问题,我将不胜感激。

缺少的东西可能是由最初的开发人员编辑的。这并不一定表明JavaCC或JJTree中发生了变化。这些都是相对成熟的项目


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

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


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

在开始之前,我将原始源代码提交给了我自己的VCS。我可以轻松地添加缺少的位,甚至可以将源代码树还原为提交的版本。我只是觉得编辑生成的文件有点让我不安:-)我最终扩展了JavaCC
SimpleNode
类,并使用了
NODE\u类
选项,这样我就不必手动编辑生成的文件了。当然,缺点是大多数节点类都有一些无用的额外字段——另外我还必须处理一些名称空间污染。据我所知,每个节点的基类定义仍然在JavaCC愿望列表中。。。
public class ASTId extends SimpleNode {
  public ASTId(int id) {
    super(id);
  }

  public ASTId(SPLParser p, int id) {
    super(p, id);
  }
}