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