Domanda
Qual è il problema "appeso altro"? (Che è il nome giusto?)
A seguito di un C ++ standard di codifica (dimenticato quale) ho sempre utilizzare staffe (blocco) con strutture di controllo. Quindi non mi normalmente hanno questo problema (a cui "se" fa l'ultimo (?) altro appartengono), ma per comprendere i possibili problemi in codice estraneo sarebbe bello con una solida conoscenza di questo problema. Ricordo di aver letto su di esso in un libro su Pascal molti anni fa, ma non riesco a trovare quel libro.
Soluzione
Quali if
non la else
appartiene?
if (a < b)
if (c < d)
a = b + d;
else
b = a + c;
(Ovviamente si dovrebbe ignorare il rientro.)
Questo è il "appeso altro problema".
C / C ++ si libera l'ambiguità di avere una regola che dice che non si può avere un-if
-senza-un-else
come il if
-corpo di un-if
-con-un-else
.
Altri suggerimenti
ambiguo altro.
Alcune informazioni qui: http://theory.stanford.edu /~amitp/yapps/yapps-doc/node3.html
Ma l'esempio classico è:
if a then
if b then
x = 1;
else
y = 1;
vs.
if a then
if b then
x = 1;
else
y = 1;
Guardando a questo da un punto di vista di design langauge.
Il BNF -come grammatica per if
-else
:
Statement :- .. STUFF..
| IfStatement
IfStatement :- IF_TOKEN '(' BoolExpression ')' Statement IfElseOpt
IfElseOpt :- /* Empty */
| ELSE_TOKEN Statement
Ora, da un punto di vista parser:
if (cond1) Statement1
if (cond2) Statement2
else Statement3
Quando si arriva alla ELSE_TOKEN il parser ha due opzioni, SHIFT o ridurre. Il problema è quello che richiede di scegliere un'altra regola che il parser deve seguire. La maggior parte dei generatori di parser di default per SHIFT quando data questa opzione.
Non vedo il problema per Pascal?
Questo è in modo non corretto rientrato.
if a then
if b then
x = 1;
else
y = 1;
Rimozione del punto e virgola da dopo x = 1 renderebbe correttamente rientrato.
Questa correttamente rientrato
if a then
if b then
x = 1;
else
y = 1;