Walter Bright の C++ Compilation に関する記事では、これら 2 つのフレーズについて説明しています。
「前処理トークンへの変換」。
初期トークンとは何ですか? 前処理トークンはどのようなものですか?
「前処理トークンの C++ トークンへの変換」 この C++ トークンとは何ですか? なぜ最初に変換されなかったのですか?
Walter Bright の C++ Compilation に関する記事では、これら 2 つのフレーズについて説明しています。
「前処理トークンへの変換」。
初期トークンとは何ですか? 前処理トークンはどのようなものですか?
「前処理トークンの C++ トークンへの変換」 この C++ トークンとは何ですか? なぜ最初に変換されなかったのですか?
前処理トークンは、プリプロセッサの文法の要素です。C++ 標準の [lex.pptoken] から:
前処理トークン:
- ヘッダー名
- 識別子
- pp 番号
- 文字リテラル
- ユーザー定義文字リテラル
- 文字列リテラル
- ユーザー定義文字列リテラル
- 前処理-op-or-punc
- 上記のいずれにもなり得ない各非空白文字
...
前処理トークンは、翻訳フェーズ 3 から 6 における言語の最小字句要素です。
したがって、「前処理トークンへの変換」は、翻訳単位を字句解析し、個々のトークンを識別するプロセスです。
C++ トークン (実際には単なる「トークン」) は [lex.token] にリストされています。
トークン:
- 識別子
- キーワード
- リテラル
- オペレーター
- 句読点
これらは、他のすべての変換フェーズ (マクロ展開など) が発生した後にのみ存在します。
プロセス全体の詳細については、C++ 標準の [lex.phases] を読むことをお勧めします。
より簡単な説明。
そして、ご存知かもしれませんが、多くのコンパイラには字句解析プロセスがあり、ソース コードはトークンに分割されます。
このソースコード:
void main()
{
int x = -3 - -5;
printf("Hello World");
} // void main()
これに似たものに変換されます:
+--------------------+------------------+ | | トークン | テキスト | +--------------------+------------------+ | | ボイド | "ボイド" | +--------------------+------------------+ | | 識別子 | "メイン" | +--------------------+------------------+ | | 左巻き | "{" | +--------------------+------------------+ | | 識別子 | "整数" | +--------------------+------------------+ | | 識別子 | "×" | +--------------------+------------------+ | | 割り当てます | "=" | +--------------------+------------------+ | | マイナス | "-" | +--------------------+------------------+ | | 整数 | "3" | +--------------------+------------------+ | | マイナス | "-" | +--------------------+------------------+ | | マイナス | "-" | +--------------------+------------------+ | | 整数 | "5" | +--------------------+------------------+ | | セミコロン | ";" | | +--------------------+------------------+ | | 識別子 | "printf" | +--------------------+------------------+ | | 左側 | "(" | +--------------------+------------------+ | | 文字列 | "ハローワールド" | +--------------------+------------------+ | | 右側 | ")" | +--------------------+------------------+ | | セミコロン | ";" | | +--------------------+------------------+ | | 右カーリー | "}" | +--------------------+------------------+ | | コメント | "// void main()" | +--------------------+------------------+
この「トークン」と呼ばれるテキストの各部分には、意味があります。
場合によっては、コンパイル プロセスの他の部分で、トークンが別のトークンに置き換えられることがあります。
+--------------------+------------------+ | | トークン | テキスト | +--------------------+------------------+ | | ボイド | "ボイド" | +--------------------+------------------+ | | 関数dec | "メイン" | +--------------------+------------------+ | | 左巻き | "{" | +--------------------+------------------+ | | タイプ | "整数" | +--------------------+------------------+ | | 変数dec | "×" | +--------------------+------------------+ | | 割り当てます | "=" | +--------------------+------------------+ | | ネガティブ | "-" | +--------------------+------------------+ | | 整数 | "3" | +--------------------+------------------+ | | 減算 | "-" | +--------------------+------------------+ | | ネガティブ | "-" | +--------------------+------------------+ | | 整数 | "5" | +--------------------+------------------+ | | セミコロン | ";" | | +--------------------+------------------+ | | 関数呼び出し | "printf" | +--------------------+------------------+ | | 左側 | "(" | +--------------------+------------------+ | | 文字列 | "ハローワールド" | +--------------------+------------------+ | | 右側 | ")" | +--------------------+------------------+ | | セミコロン | ";" | | +--------------------+------------------+ | | 右カーリー | "}" | +--------------------+------------------+ | | コメント | "// void main()" | +--------------------+------------------+
「マイナス」トークンから「負符号トークン」または「減算トークン」への変換は、この「前処理トークン」から「最終トークン」への非常に良い例です。
これは非常に概念的な説明です。特定のコンパイラ ドキュメントで、より詳細な技術情報を参照することをお勧めします。
乾杯