2011-03-20 57 views
0

我“继承了”使用来自JavaCC的JJTree实现简单语言分析器的项目。由于代码已超过5年,我决定在进行任何实际开发之前将所有依赖项(包括JavaCC)更新为最新版本。JavaCC/JJTree节点类中缺少字段?

因此,我删除了JJTree/JavaCC生成的所有文件,并使用最新版本(5.0)来重建它们。但是,生成的文件似乎错过了以前出现的字段和方法,并且代码不再编译。

我认为JavaCC中的某些内容需要我更新语法文件,因此我尝试了当前JavaCC发行版中的Interpretter示例,结果相同:缺少不允许代码编译的类字段。

例如,这里是从Interpretter例子SPL.jjt定义:

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的经验,所以我将不胜感激任何提示来解决这个问题。

回答

1

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

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

1

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

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

+1

我在开始之前将原始源代码连接到我自己的VCS。我可以轻松地添加缺失的位,甚至可以将源树还原为配置的版本。我只是发现编辑*生成的*文件有点*令人不安*因为我的敏感性:-) – thkala 2011-03-20 21:27:25

+0

我最终扩展了JavaCC'SimpleNode'类并使用了'NODE_CLASS'选项,这样我就不必手动编辑生成的文件。不利的一面是,大多数节点类都有一些额外的字段是无用的 - 另外我必须处理一些命名空间污染。据我所知,每个节点的基类定义仍然在JavaCC心愿中... – thkala 2011-03-21 17:12:12