2

私は、ソースツーソースコンパイラが標準のC文法にキーワードを追加したいと考えています(たとえば、shared)。ポインタが共有としてマークされている場合、それは直接逆参照されない特別なものです。代わりに、値を安全にコピーするために関数呼び出しを行う必要があります。

すべての変数がプリミティブ型の場合、単純なC++プログラムが変換を行います。ただし、structとunionがあり、共有ポインターを含むstruct、共有ポインターへの単純なポインターを含むstructなどの可能性があります。volatileキーワードの処理のような深刻な型チェックのように聞こえます。おそらく、既存のコンパイラを再利用または変更します。より良いオプション。しかし、どのコンパイラが変更を開始するのが簡単かはわかりません。何か提案はありますか?ちなみに、中間コードではなく、翻訳されたCコードを見たいです。それは私たちの選択を変えるでしょうか?ありがとうございました。

4

2 に答える 2

2

不透明(OPAQUE)型を知っていますか?ファイルで型を宣言し.hます。

typedef struct OpaqueType_s OpaqueType;

そしてそれを.cファイルで定義します:

struct OpaqueType_s {
   int value;
};

次に、それを定義したファイルでポインターを逆参照できますが.c、他のファイルの他の関数にのみポインターを渡します(少し似ていますvoid)。

于 2012-07-03T08:18:18.300 に答える
-1

Cフロントエンドを備えたDMSソフトウェアリエンジニアリングツールキットが適切な場合があります。

DMSは、一般的な解析/ AST構築、シンボルテーブル構築、制御およびデータフロー分析機能、AST変更のための手続き型APIと表面構文書き換えルール、およびASTからコンパイル可能なテキスト再生(コメント再生を含む)を提供します。フロントエンドはDMSを特定の言語に特化しています(たとえば、C; DMSは他の多くの言語をサポートしています)。フロントエンドはBNFによって駆動されます。すべてがその上に構築されます(属性文法などを使用)。方言管理により、言語フロントエンドを特定の方言(Cの場合、現在GCC2 / 3/4、MS Visual C、ANSI C、GreenHills C、C99などが含まれます)に特化できます。

OPのタスクを実行するために、彼は自分のバージョンのCの方言を定義し、フロントエンドに付属のシンボルテーブル機構を変更してポインターの新しいプロパティをキャプチャし、タイプチェックを変更して新しいポインタータイプが誤用されていないことを確認しました。彼の定義による。型チェックの邪魔にならないように、彼はソースからソースへの変換を記述して、shared-ptrCをバニラCに変換し、実行可能なコードを取得することができました。

別の方法としてClangまたはGCCを使用することもできますが、どちらにも文法がないため、パーサーへの変更をコードとして実装する必要があると理解しています。どちらもソースからソースへの書き換えを提供していません。Clangはソースパッチを提供していると思いますが、パッチが適用された場所に一連の書き換えを適用できるかどうかはわかりません。GCC ASTを手続き的に変更できると思いますが、ソースコードを再生成することはできません。

これらのソリューションはすべて、前処理に問題があります。ClangとGCCはプリプロセッサディレクティブを拡張する必要があると思います。DMSは、非構造化ディレクティブを拡張する必要があります。

于 2012-07-03T08:03:44.290 に答える