2011-03-20 62 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