2011-12-27 3 views
5

スペックは2.5でPPトークンのカテゴリを示しますが、最後のカテゴリが含まれていpp-tokensにはどのような文字が残っていますか?

私は苦労見つけるのを持っている上記

の1にすることはできません各非空白文字そのような文字をキャプチャするppトークンが有効なC++プログラムを生成する例です。 2.5が説明するように、プログラムには野生の"または'トークンが含まれることがありますが、動作は未定義です。有効なプログラムの例はありますか?

答えて

1

ストレイトークンを有効にすることができます。実際に;あなたはすでにそれをa previous questionにしました!

ストレイ文字トークンは、グループに表示されることがあり、そのような\u0040などUCNはないので、これらすべてのケースでは、唯一の浮遊文字トークンは、バックスラッシュであることに注意してくださいつまり

#if 0 
@ \ ` € 
#endif 

、条件付きコンパイルによってスキップUCNは識別子内の特殊なケースであり、バックスラッシュだけが「前処理トークンを構成できる文字の最長シーケンス」であり、u0040は別個の識別子である。

+0

この迷いトークンの\文字だけが最後のppトークンカテゴリと一致しますが、それは基本的なソースキャラクタセットにあるその行の唯一の文字だからです。他はUCN(識別子)になりますか、何か不足していますか?私は '#if 0'のアイデアと文字列/連結のアイデアのためにこれを受け入れています。ありがとう! –

+0

特定のUCNだけが識別子(§E)を形成できます。技術的には、3つの拡張文字が迷いのあるバックスラッシュの後に英数字のシーケンスが続き、それが識別子になると思います。これは明示的な最大マンクルールによるものです。 (実際には、これは、分音記号*を連結できないことを意味します。なぜなら、## ##演算子によって先頭のバックスラッシュのみが見られるからです!) – Potatoswatter

+0

"may"または "can"?それが「可能」であれば、IEC指令に従って、無効な文字列は依然として識別子としてレキシングされ、後で無効として拒絶されなければならない。 –

1

たとえば、$@は、そのカテゴリに属する​​と考えられます(これらの文字はソース文字セット内にあるものとします)。どちらも有効なppトークンですが、有効なトークンではないため、後で翻訳フェーズで構文エラーとして診断されます(#if#ifdefなどで削除されている場合を除く)。

このようなppトークンが有効なトークンになるケースはわかりません。

+0

Hm、 '$'および '@'は基本的なソース文字セットにありません。したがって、両方ともユニバーサル文字名に変換され、他のppトークンカテゴリ(識別子)によって処理されます。 –

+0

「#」は行の先頭にないかもしれませんか?または、行末やリテラルの内側にない '\'ですか? – rodrigo

+0

@rod a '#'は前処理opまたはpuncです。行の最後でもリテラルの内側でもない可能性があります。 '#define BAR(X)#X'を指定すると、\トークンで区切られた識別子' A'と 'nB 'を含む' BAR(A \ nB) 'と言うことができます。実装は\を含む識別子を許可します、それは単一の識別子です)。この洞察に感謝します! –

関連する問題