0

C ライクなコンパイラを開発していますが、コンパイラがシステム インクルードでどのように動作するかを知りたいです。

コンパイラはコード全体を読み取り、現在のコードの読み取りが終了した後、1 つのリストにあるすべてのインクルードを格納し、インクルードをパーサーしますか?

// file main.c
#include <stdio.h> // store in one list

// continue the parse ...
int main()
{
    return 0;
}
// now, read the includes
// after finish the includes parse, gen code of sources

// just a sample
// file stdio.h
#include <types.h> // store in list
#include <bios.h>  // store in list

void printf(...)
{
}

void scanf(...)
{
}

ところで、インクルードを読み取り、解析を停止してインクルードを読み取るシステム (テストのみ) を開発しました... (これは嫌なコードですが、機能します...) (サンプルのリンク) -> https: //gist.github.com/4399601

ところで、インクルードを読んでインクルードファイルを操作する最良の方法は何ですか??

4

4 に答える 4

5

#include#defineなどは、プリプロセッサ#ifdefと呼ばれる別のパスによって処理されます。の行をインクルードされたファイルに置き換えます。結果の一時的なソース テキストは、トークナイザーパーサーなどの後のパスに渡されます。#include

于 2012-12-28T17:11:13.480 に答える
1

# で始まる C の行は、コンパイラではなく、プリプロセッサによって処理されます。プリプロセッサは、コンパイラがコンパイルするファイルを生成します。ファイルの内容は、開発者と SDK によって定義されたものによって異なります。

于 2012-12-28T17:09:06.603 に答える
0

#で始まるものはすべてプリプロセッサ ディレクティブです.対応するコードはコンパイル時に置き換えられます..コンパイルの最初の段階は、このプリプロセッサ コンパイルです..

その後、プリプロセッサ (.i ファイル) の出力は、コンパイルの後の段階に渡されます。

コンパイルの後の段階には、LEXICAL ANALYZER、PARSER、OPTIMIZER、および CODE GENERATOR が含まれます。

于 2012-12-28T17:17:45.840 に答える
0

もし私がゼロからコンパイラを書いていたなら、私はまず第一にインクルードを扱うことが言語の必要な部分であるかどうかを考えます - もしそうなら、あなたはそれを書かなければなりませんか、それとも既存のもの (cpp など) を使うことができますか? gcc の一部)。結局のところ、コンパイラの「楽しい」部分は、コードの実際のコンパイルであり、ファイルを読み取ったり、マクロ展開によって文字列を他の文字列に置き換えたりすることではありません [もちろん、それも非常に楽しい場合がありますが、一度書くことはできますあなたは動作するコンパイラを持っています!].

インクルード ファイルのトリッキーな部分は、インクルード自体 (かなり自明、再帰的、関数) ではなく、#define/#ifdef/#if/#undef の解析、さらに重要なことに、それを置き換えることです。

楽しむ!

于 2012-12-28T17:32:50.603 に答える