「他にぶら下がっている」問題とは何ですか?(それは正しい名前ですか?)
C++ コーディング標準 (どの標準かは忘れました) に従って、私は常に制御構造でブラケット (ブロック) を使用します。したがって、私は通常、この問題を抱えていません (「if」は最後の(?) else に属します)。何年も前にパスカルに関する本で読んだことを覚えていますが、その本は見つかりません。
それ以外はあいまいです。
ここにいくつかの情報があります: http://theory.stanford.edu/~amitp/yapps/yapps-doc/node3.html
しかし、古典的な例は次のとおりです。
if a then
if b then
x = 1;
else
y = 1;
対。
if a then
if b then
x = 1;
else
y = 1;
はどちらif
にelse
属しますか?
if (a < b)
if (c < d)
a = b + d;
else
b = a + c;
(明らかに、インデントは無視する必要があります。)
それが「ぶら下がり問題」です。
C/C++ は、 an- -with-an-の-bodyとしてan- if
-without-an-を持つことはできないというルールを持つことで、あいまいさを取り除きます。else
if
if
else
言語設計の観点からこれを見てください。
-の標準的なBNFのような文法if
- else
:
Statement :- .. STUFF..
| IfStatement
IfStatement :- IF_TOKEN '(' BoolExpression ')' Statement IfElseOpt
IfElseOpt :- /* Empty */
| ELSE_TOKEN Statement
パーサーの観点から:
if (cond1) Statement1
if (cond2) Statement2
else Statement3
ELSE_TOKENに到達すると、パーサーにはSHIFTまたはREDUCEの2つのオプションがあります。問題は、どちらを選択するかは、パーサーが従わなければならない別のルールを必要とすることです。このオプションを指定すると、ほとんどのパーサージェネレーターはデフォルトでSHIFTになります。
Pascal の問題がわかりませんか?
これは正しくインデントされていません。
if a then
if b then
x = 1;
else
y = 1;
x = 1 の後ろからセミコロンを削除すると、正しくインデントされます。
これは正しくインデントされています
if a then
if b then
x = 1;
else
y = 1;