Home  

Random  

Nearby  



Log in  



Settings  



Donate  



About Wikipedia  

Disclaimers  



Wikipedia





Dangling else





Article  

Talk  



Language  

Watch  

Edit  


(Redirected from Dangling else problem)
 


The dangling else is a problem in programmingofparser generators in which an optional else clause in an if–then(–else) statement results in nested conditionals being ambiguous. Formally, the reference context-free grammar of the language is ambiguous, meaning there is more than one correct parse tree.

In many programming languages one may write conditionally executed code in two forms: the if-then form, and the if-then-else form – the else clause is optional:

ifathensifbthen s1 else s2

This gives rise to an ambiguity in interpretation when there are nested statements, specifically whenever an if-then form appears as s1 in an if-then-else form:

ifathen ifbthenselse s2

In this example, s is unambiguously executed when a is true and b is true, but one may interpret s2 as being executed when a is false (thus attaching the else to the first if) or when a is true and b is false (thus attaching the else to the second if). In other words, one may see the previous statement as either of the following expressions:

ifathen (ifbthens) else s2
ifathen (ifbthenselse s2)

The dangling else problem dates to ALGOL 60,[1] and has been resolved in various ways in subsequent languages. In LR parsers, the dangling else is the archetypal example of a shift-reduce conflict.

Avoiding ambiguity while keeping the syntax

edit

This is a problem that often comes up in compiler construction, especially scannerless parsing. The convention when dealing with the dangling else is to attach the else to the nearby if statement,[2] allowing for unambiguous context-free grammars, in particular. Programming languages like Pascal,[3]C[4] and Java[5] follow this convention, so there is no ambiguity in the semantics of the language, though the use of a parser generator may lead to ambiguous grammars. In these cases alternative grouping is accomplished by explicit blocks, such as begin...end in Pascal[6] and {...} in C.

Depending on the compiler construction approach, one may take different corrective actions to avoid ambiguity:

Avoiding ambiguity by changing the syntax

edit

The problem can also be solved by making explicit the link between an else and its if, within the syntax. This usually helps avoid human errors.[7]

Possible solutions are:

Examples

edit

Concrete examples follow.

C

edit

InC, the grammar reads, in part:

 statement = ...
    | selection-statement

 selection-statement = ...
    | IF ( expression ) statement
    | IF ( expression ) statement ELSE statement

Thus, without further rules, the statement

if (a) if (b) s; else s2;

could ambiguously be parsed as if it were either:

if (a)
{
  if (b)
    s;
  else
    s2;
}

or:

if (a)
{
  if (b)
    s;
}
else
  s2;

In practice in C the first tree is chosen, by associating the else with the nearest if.

Avoiding the conflict in LR parsers

edit

The above example could be rewritten in the following way to remove the ambiguity :

statement: open_statement
         | closed_statement
         ;

open_statement: IF '(' expression ')' statement
              | IF '(' expression ')' closed_statement ELSE open_statement
              ;

closed_statement: non_if_statement
                | IF '(' expression ')' closed_statement ELSE closed_statement
                ;

non_if_statement: ...
                ;

Any other statement-related grammar rules may also have to be duplicated in this way if they may directly or indirectly end with a statementorselection-statement non-terminal.

However, we give grammar that includes both of if and while statements.

statement: open_statement
         | closed_statement
         ;

open_statement: IF '(' expression ')' statement
              | IF '(' expression ')' closed_statement ELSE open_statement
              | WHILE '(' expression ')' open_statement
              ;

closed_statement: simple_statement
                | IF '(' expression ')' closed_statement ELSE closed_statement
                | WHILE '(' expression ')' closed_statement
                ;

simple_statement: ...
                ;

Finally, we give the grammar that forbids ambiguous IF statements.

statement: open_statement
         | closed_statement
         ;

open_statement: IF '(' expression ')' closed_statement
              | IF '(' expression ')' open_statement
              | IF '(' expression ')' closed_statement ELSE open_statement
              | WHILE '(' expression ')' open_statement
              ;

closed_statement: simple_statement
                | IF '(' expression ')' closed_statement ELSE closed_statement
                | WHILE '(' expression ')' closed_statement
                ;

simple_statement: ...
                ;

With this grammar the statement if (a) if (b) c else d can only be parsed one way, because the other interpretation (if (a) {if (b) c} else d) is produced as

statement
open_statement
IF '(' expression ')' closed_statement ELSE open_statement
'if' '(' 'a' ')' closed_statement 'else' 'd'

and then the parsing fails trying to match closed_statement to "if (b) c". An attempt with closed_statement fails in the same way. The other parse, if (a) {if (b) c else d}) succeeds:

statement
open_statement
IF '(' expression ')' closed_statement
IF '(' a ')' (IF '(' expression ')' closed_statement ELSE closed_statement)
IF '(' a ')' (IF '(' b ')' c ELSE 'd')

See also

edit

References

edit
  1. ^ Abrahams, P. W. (1966). "A final solution to the Dangling else of ALGOL 60 and related languages". Communications of the ACM. 9 (9): 679–682. doi:10.1145/365813.365821. S2CID 6777841.
  • ^ a b "5.2 Shift/Reduce Conflicts". Bison 3.7.6. Retrieved 2021-08-07. {{cite book}}: |website= ignored (help)
  • ^ ISO 7185:1990 (Pascal) 6.8.3.4: An if-statement without an else-part shall not be immediately followed by the token else.
  • ^ ISO 9899:1999 (C): 6.8.4.1(3): "An else is associated with the lexically nearest preceding if that is allowed by the syntax.", available at WG14 N1256, p. 134
  • ^ "The Java Language Specification, Java SE 9 Edition, 14.5. Statements".
  • ^ Dale, Nell B.; Weems, Chip (November 1996). "Dangling Else". Introduction to Pascal and Structured Design. Jones & Bartlett Learning. pp. 160–161. ISBN 9780763703974.
  • ^ Ambiguity of dangling else: non-context-free grammars are semantically opaque
  • ^ 4.5.1 Conditional Statements — Syntax in P. Nauer (ed.), Revised Report on the Algorithmic Language ALGOL 60, CACM 6,1, 1963 pp. 1-17
  • ^ Ambiguity of dangling else: require braces when else follows if
  • ^ Davie, Antony J. T.; Ronald Morrison (1981), Brian Meek (ed.), Recursive Descent Compiling, Ellis Horwood series in computers and their applications, Chichester, West Sussex: Ellis Horwood, p. 20, ISBN 0-470-27270-8

  • Retrieved from "https://en.wikipedia.org/w/index.php?title=Dangling_else&oldid=1208280531"
     



    Last edited on 16 February 2024, at 23:37  





    Languages

     


    Čeština
    Deutsch
    Français
    Polski
     

    Wikipedia


    This page was last edited on 16 February 2024, at 23:37 (UTC).

    Content is available under CC BY-SA 4.0 unless otherwise noted.



    Privacy policy

    About Wikipedia

    Disclaimers

    Contact Wikipedia

    Code of Conduct

    Developers

    Statistics

    Cookie statement

    Terms of Use

    Desktop