Transcript Document
Chapter 3 Context-Free Grammars and Parsing Ambiguous Grammar Gang S. Liu College of Computer Science & Technology Harbin Engineering University Compiler [email protected] 1 Ambiguous Grammar exp → exp op exp | (exp) | number op → + | - | * The string 34 – 3 * 42 has two different parse trees and syntax trees. * 34 42 34 3 * 3 42 A grammar that generates a string with two distinct parse trees is called an ambiguous grammar. Compiler [email protected] 2 Two Ways to Deal with Ambiguity 1. Disambiguating rule • • • State a rule that specifies in each ambiguous case which of the trees is correct. It corrects the ambiguity without changing and complicating the grammar. Syntactic structure of the language is not given by the grammar alone. 2. Change grammar into a form that forces the construction of a correct parse tree. In both cases we must decide which of the trees are correct. Compiler [email protected] 3 Ambiguous Grammar exp → exp op exp | (exp) | number op → + | - | * The string 34 – 3 * 42 has two different parse trees and syntax trees. * - 34 42 3 34 × * 3 √ 42 A grammar that generates a string with two distinct parse trees is called an ambiguous grammar. Compiler [email protected] 4 Precedence Some operations have precedence over other operations. Multiplication has precedence over addition. To handle the precedence of operations in the grammar, we group the operators into groups of equal precedence. We must write a different rule for each precedence. Compiler [email protected] 5 Example exp → exp op exp | (exp) | number op → + | - | * * - 34 42 3 34 × * 3 √ 42 exp → exp addop exp | term addop → + | term → term mulop term | factor mulop → * factor → (exp) | number Compiler [email protected] 6 Ambiguous 34 – 3 – 42 (34 – 3) – 42 = –11 √ 34 – (3 – 42) = 73 × (34 – 3) – 42 Compiler [email protected] 7 Associativity Some operation (like subtraction) are left associative. A series of subtraction operations is performed from left to right. exp → exp addop exp | term Recursion on both sides of the operator allows either side to match repetitions of the operator in a derivation. exp → exp addop term | term The right recursion is replaced with the base case, forcing the repetitive matches on the left side Left recursion makes addition and subtraction left associative. Compiler [email protected] 8 Example 34 - 3 - 42 has a unique parse tree Compiler [email protected] 9 Example exp → exp addop term | term addop → + | term → term mulop factor | factor mulop → * factor → (exp) | number 34- 3* 42 has a unique parse tree exp exp addop term - factor number Compiler term term mulop factor * number [email protected] factor number 10 Dangling else Problem statement → if-stmt | other if-stmt → if (exp) statement | if (exp) statement else statement exp → 0 | 1 if (0) if (1) other else other has two parse trees with two meaning if (0) if (1) other else other and if (0) if (1) other else other √ × Compiler [email protected] 11 if (0) if (1) other else other Compiler [email protected] 12 if (0) if (1) other else other Compiler [email protected] 13 Dangling else Problem statement → if-stmt | other if-stmt → if (exp) statement | if (exp) statement else statement exp → 0 | 1 if (0) if (1) other else other has two parse trees with two meaning if (0) if (1) other else other and if (0) if (1) other else other 1. Modify the grammar. 2. Disambiguating rule: the most closely nested rule. Compiler [email protected] 14 if (0) if (1) other else other Dangling else Problem statement → matched-stmt | unmatched-stmt matched-stmt → if (exp) matched-stmt else matched-stmt | other unmatched-stmt → if (exp) statement | if (exp) matched-stmt else unmatched-stmt exp → 0 | 1 Compiler [email protected] 15 Inessential Ambiguity Sometimes a grammar may be ambiguous and yet always produce unique abstract syntax trees. Example: (a+b)+c=a+(b+c) Compiler [email protected] 16 Extended BNF Notation (EBNF) { } repetitions A → β {α} and A → {α} β Compiler [email protected] 17 Left and Right Recursion Left recursive grammar: A→Aα|β Equivalent to α* A → β {α} Compiler Right recursive grammar: A→αA|β β Equivalent to α*β A → {α} β [email protected] 18 Extended BNF Notation (EBNF) { } repetitions A → β {α} and A → {α} β [ ] →optional constructs statement if-stmt | other if-stmt → if (exp) statement | if (exp) statement else statement exp → 0 | 1 Compiler statement → if-stmt | other if-stmt → if (exp) statement [ else statement ] exp → 0 |[email protected] 1 19 Syntax Diagrams Graphical representations for visually representing EBNF rules are called syntax diagrams. They consist of boxes representing terminals and nonterminals, arrowed lines representing sequencing and choices, and nonterminal labels for each diagram representing the grammar rule defining that nonterminal. A round or oval box is used to indicate terminals in a diagram, while a square or rectangular box is used to indicate nonterminals. Compiler [email protected] 20 Syntax Diagrams(cont) As an example, consider the grammar rule factor → ( exp ) | number This is written as a syntax diagram in the following way: Compiler [email protected] 21 Syntax Diagrams(cont) Syntax diagrams are written from the EBNF rather than the BNF, so we need diagrams representing repetition and optional constructs. Given a repetition such as A→{B} The corresponding syntax diagram is usually drawn as follow: Compiler [email protected] 22 Syntax Diagrams(cont) An optional construct such as A→[B] Is drawn as: Compiler [email protected] 23 Example exp → exp addop term | term addop → + | – term → term mulop factor | factor mulop → * factor → (exp) | number exp → term { addop term } addop → + | – term → factor { mulop factor } mulop → * factor → (exp) | number Compiler [email protected] 24 Example statement → if-stmt | other if-stmt → if (exp) statement | if (exp) statement else statement exp → 0 | 1 statement → if-stmt | other if-stmt → if (exp) statement [ else statement ] exp → 0 | 1 Compiler [email protected] 25 Homework 1.2 1.3 1.7 2.1 2.2 2.4 2.5 2.8 2.12 2.17 2.24 3.3 3.5 3.6 3.24 Compiler [email protected] 26