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