JavaCC/JJTree节点类中缺少字段?
我“继承”了一个使用JJTree实现简单语言解析器的项目。由于代码已经有5年多的历史,我决定在进行任何实际开发之前,将所有依赖项(包括JavaCC)更新到最新版本 因此,我删除了JJTree/JavaCC生成的所有文件,并使用最新版本(5.0)来重建它们。然而,生成的文件似乎遗漏了以前存在的字段和方法,代码不再编译 我假设JavaCC中发生了一些变化,需要我更新语法文件,因此我尝试了当前JavaCC发行版中的JavaCC/JJTree节点类中缺少字段?,java,javacc,Java,Javacc,我“继承”了一个使用JJTree实现简单语言解析器的项目。由于代码已经有5年多的历史,我决定在进行任何实际开发之前,将所有依赖项(包括JavaCC)更新到最新版本 因此,我删除了JJTree/JavaCC生成的所有文件,并使用最新版本(5.0)来重建它们。然而,生成的文件似乎遗漏了以前存在的字段和方法,代码不再编译 我假设JavaCC中发生了一些变化,需要我更新语法文件,因此我尝试了当前JavaCC发行版中的解释器示例,结果相同:缺少不允许代码编译的类字段 例如,下面是来自解释器示例的SPL.j
解释器示例,结果相同:缺少不允许代码编译的类字段
例如,下面是来自解释器示例的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。我可以轻松地添加缺少的位,甚至可以将源代码树还原为提交的版本。我只是觉得编辑生成的文件有点让我不安:-)我最终扩展了JavaCCSimpleNode
类,并使用了NODE\u类
选项,这样我就不必手动编辑生成的文件了。当然,缺点是大多数节点类都有一些无用的额外字段——另外我还必须处理一些名称空间污染。据我所知,每个节点的基类定义仍然在JavaCC愿望列表中。。。
public class ASTId extends SimpleNode {
public ASTId(int id) {
super(id);
}
public ASTId(SPLParser p, int id) {
super(p, id);
}
}