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の経験がないので、この問題を解決するためのヒントをいただければ幸いです。