あまりにもつまらないと思われる質問をするリスクを冒して、私は長い間、(さまざまなコンテキストで標準全体で発生する何かの1つの例として)integer literal
§2.14.2の次の定義を正当化しようと努めてきました。 C ++ 11標準、特に1つの詳細に関しては、構文表記自体に空白が存在します。
(この例(整数リテラルの定義)は私の質問のポイントではないことに注意してください。私の質問のポイントは、特に文法範疇名の間の空白に関して、 C++標準自体で使用される構文記述表記について質問することです。ここで紹介する例(整数リテラルの定義)は、単純で明確な例として機能するという理由だけで特に選択されています。)
(簡潔にするために§2.14.2から省略):
integer-literal:
decimal-literal integer-suffix_opt
decimal-literal:
nonzero-digit
decimal-literal digit
(予想通りnonzero-digit
、digit
[0] 1 ... 9)。(注:上記のテキストはすべて、標準ではイタリック体です。)
decimal-literal
これはすべて、構文カテゴリ記述間のスペースが実際のソースコードには存在しないと理解されていると仮定すると、私には理にかなっていますdigit
が、セクション§2.14.2に示されているように構文記述自体にのみ存在します。
この規則(ソースコードにスペースが存在しないことが理解される場合に、表記内のカテゴリ記述の間にスペースを配置する)は、仕様の他の場所で使用されます。ここでの例は、スペースがソースコードに存在しないことが明らかに想定されている明確なケースです。(これらのカテゴリ記述がソースコード内の実際のトークンに置き換えられた場合、空白または他のセパレータが存在する必要がある、またはカテゴリ記述間にオプションである標準の反例については、この質問の反例を参照してください。)
繰り返しになりますが、気まぐれになるリスクがありますが、この例のように表記を解釈するときに、ソースコードにスペースを含めないという規則のステートメントを標準のどこにも見つけることができません。
この規格では、§1.6.1(およびそれ以降)の表記規則について説明しています。これに関して私が見つけることができる唯一の関連するテキストは次のとおりです。
この国際規格で使用されている構文表記では、構文カテゴリはイタリック体で示され、リテラルの単語と文字は一定幅のタイプで示されます。選択肢の長いセットが「の1つ」というフレーズでマークされているいくつかの場合を除いて、選択肢は別々の行にリストされています。</ p>
私はそんなにつまらないとは思わないでしょう。ただし、標準内で使用されている表記法はやや扱いにくいので、すべての詳細を明確にしたいと思います。時間を割いて私にこれを記入してくれる人に感謝します。
補遺「最終的なソースコードに空白を含めるべきではないことは明らかであるため、標準でこれを明示的に述べる必要はない 」と同様の主張がなされたコメントに応えて、私はこの質問で簡単な例を選択しました、それが明らかな場合。標準では、がないと明らかでない場合が多くあります。「const」と「volatile」について議論する§8.0.4などの言語の事前知識(私の意見では):
cv-qualifier-seq:
cv-qualifier cv-qualifier-seq_opt
...ここでは反対の仮定に注意してください(最終的なソースコードでは空白、または別の区切り文字が必要です)が、構文表記自体から推測することはできません。
次のように、スペースがオプションの場合もあります。
noptr-abstract-declarator:
noptr-abstract-declarator_opt parameters-and-qualifiers
(この例では、要点を説明するために、議論されているセクション番号や言い換えは示しません。文法表記自体から、このコンテキストでは、最終的なソースコードの空白が明らかかどうかを尋ねます。トークン間のオプションです。)
これらの線に沿ったコメント-「それは明白なので、それがなければならない」-は、私が選択した例が非常に明白であるという事実の結果であると思います。それがまさに私が例を選んだ理由です。