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.

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top