3

Walter Bright の C++ Compilation に関する記事では、これら 2 つのフレーズについて説明しています。

「前処理トークンへの変換」。
初期トークンとは何ですか? 前処理トークンはどのようなものですか?

「前処理トークンの C++ トークンへの変換」 この C++ トークンとは何ですか? なぜ最初に変換されなかったのですか?

参照: http://www.drdobbs.com/blogs/cpp/228701711

4

2 に答える 2

4

前処理トークンは、プリプロセッサの文法の要素です。C++ 標準の [lex.pptoken] から:

前処理トークン:

  • ヘッダー名
  • 識別子
  • pp 番号
  • 文字リテラル
  • ユーザー定義文字リテラル
  • 文字列リテラル
  • ユーザー定義文字列リテラル
  • 前処理-op-or-punc
  • 上記のいずれにもなり得ない各非空白文字

...

前処理トークンは、翻訳フェーズ 3 から 6 における言語の最小字句要素です。

したがって、「前処理トークンへの変換」は、翻訳単位を字句解析し、個々のトークンを識別するプロセスです。

C++ トークン (実際には単なる「トークン」) は [lex.token] にリストされています。

トークン:

  • 識別子
  • キーワード
  • リテラル
  • オペレーター
  • 句読点

これらは、他のすべての変換フェーズ (マクロ展開など) が発生した後にのみ存在します。

プロセス全体の詳細については、C++ 標準の [lex.phases] を読むことをお勧めします。

于 2012-06-17T19:16:50.570 に答える
2

より簡単な説明。

そして、ご存知かもしれませんが、多くのコンパイラには字句解析プロセスがあり、ソース コードはトークンに分割されます。

このソースコード:

void main()
{
  int x = -3 - -5;
  printf("Hello World");
} // void main()

これに似たものに変換されます:

+--------------------+------------------+
| | トークン | テキスト |
+--------------------+------------------+
| | ボイド | "ボイド" |
+--------------------+------------------+
| | 識別子 | "メイン" |
+--------------------+------------------+
| | 左巻き | "{" |
+--------------------+------------------+
| | 識別子 | "整数" |
+--------------------+------------------+
| | 識別子 | "×" |
+--------------------+------------------+
| | 割り当てます | "=" |
+--------------------+------------------+
| | マイナス | "-" |
+--------------------+------------------+
| | 整数 | "3" |
+--------------------+------------------+
| | マイナス | "-" |
+--------------------+------------------+
| | マイナス | "-" |
+--------------------+------------------+
| | 整数 | "5" |
+--------------------+------------------+
| | セミコロン | ";" | |
+--------------------+------------------+
| | 識別子 | "printf" |
+--------------------+------------------+
| | 左側 | "(" |
+--------------------+------------------+
| | 文字列 | "ハローワールド" |
+--------------------+------------------+
| | 右側 | ")" |
+--------------------+------------------+
| | セミコロン | ";" | |
+--------------------+------------------+
| | 右カーリー | "}" |
+--------------------+------------------+
| | コメント | "// void main()" |
+--------------------+------------------+

この「トークン」と呼ばれるテキストの各部分には、意味があります。


場合によっては、コンパイル プロセスの他の部分で、トークンが別のトークンに置き換えられることがあります。

+--------------------+------------------+
| | トークン | テキスト |
+--------------------+------------------+
| | ボイド | "ボイド" |
+--------------------+------------------+
| | 関数dec | "メイン" |
+--------------------+------------------+
| | 左巻き | "{" |
+--------------------+------------------+
| | タイプ | "整数" |
+--------------------+------------------+
| | 変数dec | "×" |
+--------------------+------------------+
| | 割り当てます | "=" |
+--------------------+------------------+
| | ネガティブ | "-" |
+--------------------+------------------+
| | 整数 | "3" |
+--------------------+------------------+
| | 減算 | "-" |
+--------------------+------------------+
| | ネガティブ | "-" |
+--------------------+------------------+
| | 整数 | "5" |
+--------------------+------------------+
| | セミコロン | ";" | |
+--------------------+------------------+
| | 関数呼び出し | "printf" |
+--------------------+------------------+
| | 左側 | "(" |
+--------------------+------------------+
| | 文字列 | "ハローワールド" |
+--------------------+------------------+
| | 右側 | ")" |
+--------------------+------------------+
| | セミコロン | ";" | |
+--------------------+------------------+
| | 右カーリー | "}" |
+--------------------+------------------+
| | コメント | "// void main()" |
+--------------------+------------------+

「マイナス」トークンから「負符号トークン」または「減算トークン」への変換は、この「前処理トークン」から「最終トークン」への非常に良い例です。

これは非常に概念的な説明です。特定のコンパイラ ドキュメントで、より詳細な技術情報を参照することをお勧めします。

乾杯

于 2012-06-17T23:55:34.837 に答える