0

JavaCCからJJTreeを使用して単純な言語パーサーを実装するプロジェクトを「継承」しました。コードは5年以上前のものだったので、実際の開発を行う前に、JavaCCを含むすべての依存関係を最新リリースに更新することにしました。

そのため、JJTree / JavaCCで生成されたファイルをすべて削除し、最新バージョン(5.0)を使用して再構築しました。ただし、結果のファイルには、以前に存在していたフィールドとメソッドが欠落しているように見え、コードはそれ以上コンパイルされません。

JavaCCで何かが変更され、文法ファイルを更新する必要があると想定したため、現在のJavaCCディストリビューションの例を試してみましたInterpretterが、同じ結果になりました。コードのコンパイルを許可しないクラスフィールドがありません。

たとえば、次SPL.jjtInterpretter例の定義を次に示します。

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

4

2 に答える 2

1

欠落しているものは、おそらく元の開発者によって編集されたものです。JavaCC または JJTree で何かが変更されたことを示すとは限りません。これらは比較的成熟したプロジェクトです。

オリジナルがバージョン管理システムにチェックインされているか、コードを元に戻せるようにバックアップされていることを願っています。おそらく、削除して再コンパイルするという決定は最善ではありませんでした。

于 2011-03-20T21:22:32.137 に答える
1

生成されたノード ファイルを編集するのはかなり標準的な方法ですが、パーサー ファイルとトークン マネージャーは変更しないでください。それが TOKEN_MGR_DECLS と文法ファイル内のコードの目的です。

人々がこれらのファイルを編集する理由は、あまり頻繁に変更されないからです...もちろん、変更するときは少し面倒ですが。

于 2011-03-22T02:12:33.707 に答える