This is an old revision of the document!


9. Context-Free Languages

Find PDAs that accept each of the languages below, both by empty stack and by final state. Identify which approach feels more suitable for each language. Find CFGs for the languages. For each grammar, make sure it is not ambiguous. (Start with any CF grammar that accepts L. Then write another non-ambiguous grammar for the same language).

9.1.1. $ L = \{\: w \in \{A,B\}^* \ | \:w \text{ is a palindrome}\} $.

Click to display ⇲

Click to hide ⇱

$ S \leftarrow ASA | BSB | A | B | \epsilon $

9.1.2. $ L = \{ A^{m} B^{m+n} C^{n} \ | \: n, m \geq 0 \} $

Click to display ⇲

Click to hide ⇱

$ S \leftarrow XY $
$ X \leftarrow AXB | \epsilon $
$ Y \leftarrow BYC | \epsilon $

9.1.3. $ L = \{w \in \{a, b\}^* | \#_a(w) = \#_b(w) \} $

Click to display ⇲

Click to hide ⇱

Try #1:
$ S \leftarrow abS | baS | \epsilon $
incomplete because of: “aabb”
Try #2:
$ S \leftarrow aSb | bSa | SS | \epsilon $
incomplete because of: “abab”

Solution 1: We can either generate one a followed by one b, as well as one b followed by one a. At the same time, other sequences of equal number of a and b can appear freely, hence one solution is: $ S \leftarrow aSbS \mid bSaS \mid \epsilon$

Solution 2:

Idea: A = rule that promises that exactly one letter 'a' is extra; B = rule that promises that exactly one letter 'b' is extra
$ S \leftarrow aBS | bAS | \epsilon $
$ A \leftarrow a | bAA $
$ B \leftarrow b | aBB $

We can easily check by induction (over the length of the derivation sequence) that $ A \Rightarrow^* w$ iff $ \#_A(w) = 1 + \#_B(w)$ . The basis case (length 1) is straightforward as $ A \Rightarrow a$ . Now suppose $ A \Rightarrow bAA \Rightarrow^* bw_1w_2$ . By induction hypothesis: $ \#_A(bw_1w_2) = \#_A(w_1) + \#_A(w_2) = \#_B(w_1) + 1 + \#_B(w_2) + 1 = \#_B(bw_1w_2)+1$ . *-/

9.1.4. $ L = \{w \in \{a, b\}^* | \#_a(w) \neq \#_b(w) \} $

Click to display ⇲

Click to hide ⇱

/-* Solution 1:

$ S \leftarrow A | B $
$ A \leftarrow G |GA $
$ B \leftarrow H | HB $
$ G \leftarrow Ea $
$ H \leftarrow Eb $
$ E \leftarrow aME | bNE | \epsilon $
$ M \leftarrow b | aMM $
$ N \leftarrow a | bNN $
Non-terminal E generates words with the same number of 'a' and 'b', as it was presented in the previous exercise.
Non-terminal A generates words that have more “a”, while B generates words with fewer “a”.
Then S generates words with either more, or fewer 'a' than 'b'.

Solution 2: *-/ Start with a grammar that generates $ L_= = \{w \in \{a, b\}^* $ , for instance $ S \leftarrow aSbS $ . Next, we generate two grammars, one for $ L_> = \{w \in \{a, b\}^* $ , and another for $ L_< = \{w \in \{a, b\}^* $ , and we can combine them into our response. We illustrate writing a rule for the former.

The language $ L_>$ can be described by the following language operations: $ L_> = L_=(\{a\}L_=)^+$ . Note that $ \epsilon$ is member of $ L_=$ . If $ S$ is the start symbol for $ L_=$ , then our grammar is: $ S_> \leftarrow SaST, T \leftarrow aST $ .

9.1.5. $ L = \{a^ib^jc^k | i = j \lor j = k \} $

9.1.6. Prove that PDAs that accept by empty stack and PDAs that accept by final state are equivalent. Find a transformation from a PDA accepting by empty stack to one accepting by final state and a transformation from a PDA accepting by final state to one accepting by empty stack.

Click to display ⇲

Click to hide ⇱

Inherently ambiguous grammar because of the case i = j = k
$ S \leftarrow X | Y $
$ X \leftarrow ZC $
$ Z \leftarrow aZb | \epsilon $
$ C \leftarrow cC | \epsilon $
$ Y \leftarrow AT $
$ A \leftarrow aA | \epsilon $
$ T \leftarrow bTc | \epsilon $

Which of the following grammars are ambiguous? Justify each answer. Modify the grammar to remove ambiguity, wherever the case.

9.2.1.

$ S \leftarrow aA | A $
$ A \leftarrow aA | B $
$ B \leftarrow bB | \epsilon $

Click to display ⇲

Click to hide ⇱

Ambiguuous: yes
  • S ⇒ aA ⇒ aB ⇒ abB ⇒ ab
  • S ⇒ A ⇒ aA ⇒ aB ⇒ abB ⇒ ab

Repaired, unambiguous grammar:

$ S \leftarrow A $
$ A \leftarrow aA | B $
$ B \leftarrow bB | \epsilon $

9.2.2.

$ S \leftarrow AS | \epsilon $
$ A \leftarrow 0A1 | 01 | B $
$ B \leftarrow B1 | \epsilon $

Click to display ⇲

Click to hide ⇱

Ambiguuous: yes
  • S ⇒ $ \epsilon $
  • S ⇒ AS ⇒ BS ⇒ S ⇒ $ \epsilon $

Repaired:
$ S \leftarrow 1BS' | S' $
$ S' \leftarrow ABS' | \epsilon $
$ A \leftarrow 0A1 | 01 $
$ B \leftarrow B1 | \epsilon $

9.2.3.

$ S \leftarrow ASB | BSA | \epsilon $
$ A \leftarrow aA | \epsilon $
$ B \leftarrow bB | \epsilon $

Click to display ⇲

Click to hide ⇱

Ambiguuous: yes
  • S ⇒ ε
  • S ⇒ ASB ⇒ SB ⇒ B ⇒ $ \epsilon $

The grammar actually generates the language {a,b}*:

$ S \Rightarrow ASB \Rightarrow aASB \Rightarrow aSB \Rightarrow aS $
$ S \Rightarrow BSA \Rightarrow bBSA \Rightarrow bSA \Rightarrow bS $

Repaired:
$ S \leftarrow aS | bS | \epsilon $

9.2.4. Write an ambiguous grammar for $ L(a^*) $.

Click to display ⇲

Click to hide ⇱

$ S \leftarrow aS | aaS | \epsilon $
Ambiguuous: yes
  • S ⇒ aS ⇒ aaS ⇒ aa
  • S ⇒ aaS ⇒ aa