The dangling else ambiguity (cont.)

advertisement
The dangling-else ambiguity
Previously discussed
• The Java compiler (translator) consider white space
characters (i.e., SPACE, TAB and New line) as
insignificant (See:
http://mathcs.emory.edu/~cheung/Courses/170/Syllabus/03
/intro-java.html)
• All that the Java compiler cares about is syntactical
correctness
Ambiguous syntax
• Ambiguous syntax
• A language allows ambiguous syntax is the same
sentence can be read in more than one way
Ambiguous syntax (cont.)
• Example: English (in fact, all human languages)
• An American History professor
can mean:
• a History professor who is an American
citizen (i.e.: American History professor)
• a professor of American History. (i.e.:
American History professor)
Ambiguous syntax (cont.)
• How humans deal with ambiguity:
• Humans can often use additional information to
resolve the ambiguity
(E.g., we have additional information about the
specific professor)
• If we cannot resolve the ambiguity, we (humans)
can ask further questions to resolve it.
Ambiguity in programming languages ?
• Difference between natural language and programming
language:
• A natural language evolves through usage
It's evolution is not controlled
--------------------------------------------------------------• A programming language is designed by one or a
group of humans
It's design is completely controlled
Ambiguity in programming languages ? (cont.)
• Commonly held goal in the design of a programming
language:
• A programming language should have an
unambiguous syntax
• In other words:
• There is exactly one way to interpret each
program statement syntactically
Ambiguity in programming languages ?
(cont.)
• Historical facts about programming languages:
• Older programming languages does have ambiguous
syntax
These languages include:
• Algol 60
• Pascal
•C
Ambiguity in programming languages ?
(cont.)
• Modern programming languages are unambiguous
Examples:
• Algol 68
• Ada
• Modula
Ambiguity in programming languages ?
(cont.)
• However:
• Because Java (and C++) are derived from the older
programming language C (and C has an ambiguous
syntax):
• Java has inherited the ambiguous syntax in C...
(This is very unfortunate for a modern language like
Java and C++, but the designers want to keep C's syntax
extremely badly)
The dangling else ambiguity
• The dangling else ambiguity was first discovered in the
programming language Algol 60
• I will use a concrete example to illustrate this famous
ambiguity
The dangling else ambiguity (cont.)
• Programming problem: shipping cost
• Country code for US = 1
Cost to ship to a package to a destination in the US = $5.00,
except for Hawaii which cost $10.00
The state code for Hawaii = 50
• The shipping cost for a destination outside the US is $20.00
The dangling else ambiguity (cont.)
• Write a Java program than reads in:
• A country code (integer)
• A state code (integer)
and prints the shipping cost
The dangling else ambiguity (cont.)
• Algorithm:
The dangling else ambiguity (cont.)
• Note:
• There is no ambiguity in the algorithm given as a
structure diagram
• The ambiguity will be introduced when we write
the algorithm in the Java programming language !!!
cost = 5.0;
if ( country_code == 1 )
if ( state_code == 50 )
cost = 10.0;
// Hawaii
else
cost = 20.0;
// Outside US
The dangling else ambiguity (cont.)
(The algorithm is unnecessarily confusing because I want
to show the ambiguous syntax....)
The dangling else ambiguity (cont.)
• There are 2 different yet syntactically correct ways to read
the if-statements:
The dangling else ambiguity (cont.)
• Explanation:
• The first way is to associate the keyword else with the
first keyword if
• The first if is an if-else-statement
• The second if is an if-statement that comprises
the then-part of the (first) if-else-statement
See the corresponding structure diagram
The dangling else ambiguity (cont.)
• The second way is to associate the keyword else with the
second keyword if
• The first if is an if-statement
• The second if is an if-else-statement that
comprises the then-part of the (first) ifstatement
See the corresponding structure diagram
The dangling else ambiguity (cont.)
• (This is the only ambiguous syntax in the Java
programming language which it had inherited from C)
The dangling else ambiguity (cont.)
• Resolving the dangling-else ambiguity:
• Java (and C, C++) imposes the following rule:
• The keyword else is associated to the nearest
keyword if that makes a syntactically correct
statement
The dangling else ambiguity (cont.)
• Example:
The dangling else ambiguity (cont.)
• Java program:
import java.util.Scanner;
public class DanglingElse01
{
public static void main(String[] args)
{
int country_code, state_code;
double cost;
Scanner in = new Scanner(System.in); // Construct Scanner object
System.out.print("Enter country code: ");
country_code = in.nextInt();
// Read in integer
System.out.print("Enter country code: ");
state_code = in.nextInt();
// Read in integer
The dangling else ambiguity (cont.)
cost = 5.0;
if ( country_code == 1 )
if ( state_code == 50 )
cost = 10.0;
// Hawaii
else
cost = 20.0;
// Outside US
System.out.println("Shipping cost = " + cost);
}
}
The dangling else ambiguity (cont.)
• Sample execution:
Enter country code: 1
Enter country code: 40
Shipping cost = 20.0
(code for US)
(not Hawaii)
(should be $5 !)
The dangling else ambiguity (cont.)
• The reason is that the Java program is executed as follows:
The dangling else ambiguity (cont.)
• Example Program: (Demo above code)
– Prog file:
http://mathcs.emory.edu/~cheung/Courses/170/Syllabus/06/Progs/
DanglingElse01.java
• How to run the program:
• Right click on link and save in a scratch directory
• To compile: javac DanglingElse01.java
• To run:
java DanglingElse01
Download