6

C/C++ コンパイラは、ソース コード内のエスケープ文字 ["\"] をどのように操作しますか? その文字を処理するためにコンパイラの文法はどのように書かれていますか? その文字に遭遇した後、コンパイラは何をしますか?

4

4 に答える 4

14

ほとんどのコンパイラはいくつかの部分に分かれています。コンパイラのフロントエンドは字句解析器またはスキャナと呼ばれます。コンパイラのこの部分は、実際の文字を読み取り、トークンを作成します。エスケープ文字を見て、それが本物であるか (たとえば、文字列内にある場合)、または次の文字を変更するかを決定するステート マシンがあります。トークンは、エスケープ文字またはその他のトークン (タブや改行など) として、コンパイラの次の部分 (パーサー) に適宜出力されます。ステート マシンは、複数の文字を 1 つのトークンにグループ化できます。

于 2008-11-27T10:27:48.943 に答える
6

このテーマに関する興味深いメモは、信頼について [PDF リンク]です。

この論文では、コンパイラがこの問題を正確に処理できる1つの方法について説明し、cで書かれたcコンパイラがコードをASCII値に明示的に変換しない方法を示しています。また、新しいエスケープ コードをコンパイラにブートストラップして、新しいコードの ASCII 値も暗黙的に理解できるようにする方法。

于 2008-11-27T20:28:53.677 に答える
2

通常、次の文字をエスケープします。

  • 文字列リテラルまたは文字リテラルでは、次の文字をエスケープすることを意味します。\a「アラート」(端末の点滅、ビープ音など)を\n意味し、「改行」を\xNUM意味します。たとえば、16進数を意味します。
  • 文字列内であるかどうかに関係なく(さらには行全体のコメント内でも)、改行の前に最後に表示される文字として表示される場合、行継続として機能します。次の改行文字は無視され、次の行は次のようになります。現在の行とマージされました。
于 2008-11-27T11:06:20.533 に答える
1

次の文字(のような\n)を持つエスケープ文字は、Cコンパイラの単一文字です-スキャナーはそれを文字トークンとしてパーサーに提示するため、エスケープ文字のパーサーに特別な構文規則は必要ありません。

于 2008-11-27T10:50:05.433 に答える