You are on page 1of 18

CSCI 2670

Introduction to Theory of
Computing

September 21, 2004


Agenda
• Last week
– Pumping lemma
– Context-free grammars
• Examples, definition, strategies for building
• This week
– More on CFG’s
• Ambiguity, Pushdown automata, pumping
lemma for CFG’s
• Next week
– Midterm (Chapters 1 & 2)
Announcement
• Homework due next Tuesday (9/28)
– 2.8, 2.9, 2.12, 2.13, 2.15, 2.18 d, 2.22
Ambiguity
• Consider the CFG ({S},{0,1},R,S),
where the rules of R are
S0|1|S+S|S*S
• Derive the string 0 * 1 + 1
Ambiguity
S0|1|S+S|S*S
• 0*1+1

S S

S * S S + S

0 S + S S * S 1

1 1 0 1

Different parse trees!


Leftmost derivation & ambiguity
• A derivation of a string w in a
grammar G is a leftmost derivation if
every step of the derivation replaced
the leftmost variable
• A string is derived ambiguously in
CFG G if it has two or more different
leftmost derivations
• The grammar G is ambiguous if it
generates some string ambiguously
– Some grammars are inherently
ambiguous
Chomsky normal form
• Method of simplifying a CFG
Definition: A context-free grammar is in
Chomsky normal form if every rule is of one
of the following forms
A  BC
Aa
where a is any terminal and A is any
variable, and B, and C are any variables or
terminals other than the start variable
the rule S  ε is permitted,
where S is the start variable
CFG’s and Chomsky normal form
Theorem: Any context-free language is
generated by a context-free
grammar in Chomsky normal form.
Proof idea: Convert any CFG to one in
Chomsky normal form by removing
or replacing all rules in the wrong
form
1. Add a new start symbol
2. Eliminate ε rules of the form A  ε
3. Eliminate unit rules of the form A  B
4. Convert remaining rules into proper form
Convert a CFG to Chomsky normal
form
1. Add a new start symbol
- Create the following new rule
S0  S
where S is the start symbol and S0
is not used in the CFG
Convert a CFG to Chomsky normal
form
2. Eliminate all ε rules A  ε, where A
is not the start variable
- For each rule with an occurrence of
A on the right-hand side, add a new
rule with the A deleted
R  uAv becomes R  uAv | uv
R  uAvAw becomes R  uAvAw | uvAw | uAvw | uvw
- If we have R  A, replace it with R
 ε unless we had already removed R
ε
Convert a CFG to Chomsky normal
form
3. Eliminate all unit rules of the form
AB
- For each rule B  u, add a new rule
A  u, where u is a string of
terminals and variables, unless this
rule had already been removed
- Repeat until all unit rules have been
replaced
Convert a CFG to Chomsky normal
form
4. Convert remaining rules into proper
form
- What’s left?
- Replace each rule A  u1u2…uk,
where k  3 and ui is a variable or a
terminal with k-1 rules
A  u1A1 A1  u2A2 … Ak-2  uk-1uk
Example
S  S1 | S2
S1  S1b | Ab | ε
A  aAb | ab
S2  S2a | Ba | ε
B  bBa | ba

Step 1: Add a new start symbol


Example
S0  S
S  S1 | S2
S1  S1b | Ab
A  aAb | ab | ε
S2  S2a | Ba
B  bBa | ba | ε

Step 2: Eliminate ε rules


Example
S0  S
S  S1 | S2
S1  S1b | Ab | b
A  aAb | ab
S2  S2a | Ba | a
B  bBa | ba

Step 3: Eliminate all unit rules


Example
S0  S1b | Ab | b | S2a | Ba | a
S  S1b | Ab | b | S2a | Ba | a
S1  S1b | Ab | b
A  aAb | ab
S2  S2a | Ba | a
B  bBa | ba

Step 4: Convert remaining rules to


proper form
Example
S0  S1b | Ab | b | S2a | Ba | a
S  S1b | Ab | b | S2a | Ba | a
S1  S1b | Ab | b
A  aA1 | ab
A1  Ab
S2  S2a | Ba | a
B  bB1 | ba
B1  Ba
Tomorrow
• Pushdown automata

You might also like