0

Bison 1.875 から Bison 3.0.4 にアップグレードしていますが、下位互換性を維持したいと考えています。

  • 関数呼び出しyyparse(void *)は 1.875 では機能しますが、3.0.4 では機能しません
  • 関数呼び出しyyparse()は 3.04 では機能しますが、1.875 では機能しません

Bisonは、実際のバージョンが最新かどうかを判断し、使用する関数呼び出しを決定するため#define YYBISON_VERSION "3.0.2" に使用した行を含む cpp ファイルを出力します。strcmp

int ret = 0;
if(bisonVersionCheck < 0)
{
    ret = yyparse(void *);
}
else
{
    ret = yyparse();
}

しかし、ご覧のとおり、これは実行時に決定されるため、コンパイラは関数呼び出しに対して何もできないと文句を言います。

プリプロセッサ ディレクティブを使用して適切な関数呼び出しを選択できるように、使用できるマクロが必要です。バイソンのドキュメントでそのようなマクロを見つけることができません。

  • 「__BISON_VERSION」そっくりマクロについて知っている人はいますか?
  • バイソンバージョンに基づいて正しい関数呼び出しを行う別のアイデアを持っている人はいますか?
4

1 に答える 1

0

ret = yyparse(void *)bison のバージョンに関係なく、構文的に正しい C ではありません。おそらく、それはあなたがタイプしようとしていたものではありません。

なぜyyparse()あなたの 1.875 コードで動作しないのか、私にはわかりません。に引数をYYPARSE_PARAM追加するために、おそらくどこかでマクロを定義します。古いバージョンの bison では、呼び出し規約が変更されますが、最新のバージョンでは無視されると思います。必要に応じて、置換の宣言を参照してください (ただし、質問は引数 toが使用されていないことを暗示しているようです)。void*yyparseyyparse℅parse-paramyyparse

于 2015-07-23T13:20:43.607 に答える