0% found this document useful (0 votes)
49 views39 pages

Toc File1

The document discusses context-free languages and grammars. It defines context-free grammars using the formalism G = (V, T, S, P) where V is a set of variables, T is a set of terminals, S is the start variable, and P is a set of productions. It provides examples of context-free grammars that generate languages like {anbn: n >= 0} and discusses derivation order, derivation trees, ambiguity, and how some languages cannot be generated without ambiguity.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
49 views39 pages

Toc File1

The document discusses context-free languages and grammars. It defines context-free grammars using the formalism G = (V, T, S, P) where V is a set of variables, T is a set of terminals, S is the start variable, and P is a set of productions. It provides examples of context-free grammars that generate languages like {anbn: n >= 0} and discusses derivation order, derivation trees, ambiguity, and how some languages cannot be generated without ambiguity.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 39

Context-Free Languages

Context-Free Languages

n n R
{a b : n  0} {ww }

Regular Languages
a *b * ( a  b) *
Context-Free Languages

Context-Free Pushdown
Grammars Automata

stack

automaton
Context-Free Grammars
Context-Free Grammar: G  (V , T , S , P )

All productions in P are of the form

A s
Variable String of
variables and
terminals
Example of Context-Free Grammar
S  aSb | 
productions
P  {S  aSb, S  }

G  V ,T , S , P 

V  {S }
T  {a, b} start variable
variables
terminals
Example:

context-free grammar G : S  aSb | 

L(G )  {a b : n  0}
n n

Since, there is derivation



S a b n n
for any n 0
Context-Free Language:
A language L is context-free
if there is a context-free grammar G
with L  L (G )
Example:

L  {a b : n  0}
n n

is a context-free language
since context-free grammar G :
S  aSb | 

generates L(G )  L
Another Example

Context-free grammar G :
S  aSa | bSb | 
Example derivations:
S  aSa  abSba  abba
S  aSa  abSba  abaSaba  abaaba

L(G )  {ww : w {a, b}*}


R

Palindromes of even length


Another Example
Context-free grammar G :
S  aSb | SS | 
Example derivations:
S  SS  aSbS  abS  ab
S  SS  aSbS  abS  abaSb  abab

L(G )  {w : na (w)  nb (w)}


Describes
matched
parentheses: () ((( ))) (( )) a  (, b )
Derivation Order
and
Derivation Trees
Derivation Order

Consider the following example grammar


with 5 productions:

1. S  AB 2. A  aaA 4. B  Bb
3. A   5. B  
1. S  AB 2. A  aaA 4. B  Bb
3. A   5. B  

Leftmost derivation order of string aab :

1 2 3 4 5
S  AB  aaAB  aaB  aaBb  aab

At each step, we substitute the


leftmost variable
1. S  AB 2. A  aaA 4. B  Bb
3. A   5. B  

Rightmost derivation order of string aab :

1 4 5 2 3
S  AB  ABb  Ab  aaAb  aab
At each step, we substitute the
rightmost variable
1. S  AB 2. A  aaA 4. B  Bb
3. A   5. B  

Leftmost derivation of aab :


1 2 3 4 5
S  AB  aaAB  aaB  aaBb  aab

Rightmost derivation of aab :


1 4 5 2 3
S  AB  ABb  Ab  aaAb  aab
Derivation Trees
Consider the same example grammar:

S  AB A  aaA |  B  Bb | 

And a derivation of aab :

S  AB  aaAB  aaABb  aaBb  aab


S  AB A  aaA |  B  Bb | 

S  AB
S

A B

yield AB
S  AB A  aaA |  B  Bb | 

S  AB  aaAB
S

A B

yield aaAB
a a A
S  AB A  aaA |  B  Bb | 

S  AB  aaAB  aaABb
S

A B

a a A B b

yield aaABb
S  AB A  aaA |  B  Bb | 
S  AB  aaAB  aaABb  aaBb
S

A B

a a A B b

yield
 aa Bb  aaBb
S  AB A  aaA |  B  Bb | 
S  AB  aaAB  aaABb  aaBb  aab
Derivation Tree S
(parse tree)
A B

a a A B b
yield
  aa  b  aab
Sometimes, derivation order doesn’t matter
Leftmost derivation:
S  AB  aaAB  aaB  aaBb  aab
Rightmost derivation:
S  AB  ABb  Ab  aaAb  aab
S

Give same
A B
derivation tree
a a A B b

 
Ambiguity
Grammar for mathematical expressions

E  E  E | E  E | (E) | a

Example strings:
(a  a )  a  (a  a  (a  a ))

Denotes any number


E  E  E | E  E | (E) | a

E  E  E  a E  a EE
E
 a  a E  a  a*a
E  E
A leftmost derivation
for a  a  a
a E  E

a a
E  E  E | E  E | (E) | a

E  EE  E  EE  a EE


E
 a  aE  a  aa
E  E
Another
leftmost derivation
for a  a  a E  E a

a a
E  E  E | E  E | (E) | a

Two derivation trees


for a  a  a
E E

E  E E  E

a E  E E  E a

a a a a
take a2

a  a a  2  22
E E

E  E E  E

2 E  E E  E 2

2 2 2 2
Good Tree Bad Tree
2  22  6 2  22  8
6 Compute expression result 8
E using the tree E
2 4 4 2
E  E E  E
2 2 2 2
2 E  E E  E 2

2 2 2 2
Two different derivation trees
may cause problems in applications which
use the derivation trees:

• Evaluating expressions

• In general, in compilers
for programming languages
Another ambiguous grammar:

IF_STMT  if EXPR then STMT


| if EXPR then STMT else STMT

Variables Terminals

Very common piece of grammar


in programming languages
If expr1 then if expr2 then stmt1 else stmt2
IF_STMT

if expr1 then STMT

if expr2 then stmt1 else stmt2

Two derivation trees


IF_STMT

if expr1 then STMT else stmt2

if expr2 then stmt1


In general, ambiguity is bad
and we want to remove it

Sometimes it is possible to find


a non-ambiguous grammar for a language

But, in general we cannot do so


A successful example:
Equivalent
Ambiguous
Non-Ambiguous
Grammar
Grammar
E E E
E  E T |T
E  E E
T T  F | F
E  (E )
E a F  (E ) | a
generates the same
language
E  E T T T  F T  a T  a T F
 a  F F  a  aF  a  aa
E
E  E T |T
E  T
T T F | F
F  (E) | a T T  F

Unique F F a
derivation tree
for a  a  a a a
An un-successful example:

L  {a b c }  {a b c }
n n m n m m

n, m  0

L is inherently ambiguous:

every grammar that generates this


language is ambiguous
Example (ambiguous) grammar for L:

L  {a b c }  {a b c }
n n m n m m

S  S1 | S 2 S1  S1c | A S 2  aS 2 | B
A  aAb |  B  bBc | 
The string a n b nc n  L
has always two different derivation trees
(for any grammar)

For example
S S

S1 S2

S1 c a S2

You might also like