Roikkuva else

(Alun perin kurssin TIEA241 Automaatit ja kieliopit syksy 2017 materiaaleista.)

Klassinen ongelma ohjelmointikielten kääntäjien tekniikassa on ns. roikkuva else (engl. dangling else). Tarkastellaan seuraavaa BNF-fragmenttia:

<statement> ::=
  print <expression> ;
| { <statement-list> }
| if ( <expression> ) <statement>
| if ( <expression> ) <statement> else <statement>

<statement-list> ::=
  <empty>
| <statement-list> <statement>

<empty> ::=

Tästä on mahdollista johtaa kaksi eri jäsennyspuuta merkkijonolle if (a) if (b) print 1; else print 2;, ja nämä kaksi eri jäsennyspuuta johtavat ohjelman erilaiseen käyttäytymiseen, kun a on epätosi (toinen tulostaa 2 ja toinen ei mitään). Tapana on tulkita, että else paritetaan aina lähimpään vapaaseen if-lauseeseen, jolloin oikea tulostus on tyhjä; tämä saadaan aikaiseksi esimerkiksi seuraavalla kielioppifragmentilla:

<statement> ::=
  <matched-statement>
| <open-statement>

<matched-statement> ::=
  print <expression> ;
| { <statement-list> }
| if ( <expression> ) <matched-statement> else <matched-statement>

<open-statement> ::=
  if ( <expression> ) <statement>
| if ( <expression> ) <matched-statement> else <open-statement>

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.