====== 9. Context-Free Languages ======
===== 9.1. Accepting and generating a CF language =====
Write a PDA as well as a CF grammar for the following languages. Specify - for each PDA, the way it accepts (by empty-stack or by final state). 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}\} $.
$ S \leftarrow ASA | BSB | A | B | \epsilon $
{{ :lfa:2022:lfa2022_lab9_1_1.png?400 |}}
**9.1.2.** $ L = \{ A^{m} B^{m+n} C^{n} \ | \: n, m \geq 0 \} $
$ S \leftarrow XY $ \\
$ X \leftarrow AXB | \epsilon $ \\
$ Y \leftarrow BYC | \epsilon $
{{ :lfa:2022:lfa2022_lab9_1_4.png?400 |}}
**9.1.3.** $ L = \{w \in \{a, b\}^* | \#_a(w) = \#_b(w) \} $
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:
$math[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 $
{{ :lfa:2022:lfa2022_lab9_1_3.png?300 |}}
We can easily check by induction (over the length of the derivation sequence) that $math[A \Rightarrow^* w] iff $math[\#_A(w) = 1 + \#_B(w)].
The basis case (length 1) is straightforward as $math[A \Rightarrow a]. Now suppose $math[A \Rightarrow bAA \Rightarrow^* bw_1w_2]. By induction hypothesis: $math[\#_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) \} $
/*
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'.
{{ :lfa:2022:lfa2022_lab9_1_4.png?400 |}}
Solution 2:
*/
Start with a grammar that generates $math[L_= = \{w \in \{a, b\}^* | \#_a(w) = \#_b(w) \}], for instance $math[S \leftarrow aSbS | bSaS | \epsilon]. Next, we generate two grammars, one for $math[L_> = \{w \in \{a, b\}^* | \#_a(w) > \#_b(w) \}], and another for $math[L_< = \{w \in \{a, b\}^* | \#_a(w) < \#_b(w) \}], and we can combine them into our response. We illustrate writing a rule for the former.
The language $math[L_>] can be described by the following language operations: $math[L_> = L_=(\{a\}L_=)^+]. Note that $math[\epsilon] is member of $math[L_=]. If $math[S] is the start symbol for $math[L_=], then our grammar is: $math[S_> \leftarrow SaST, T \leftarrow aST | \epsilon].
**9.1.5.** $ L = \{a^ib^jc^k | i = j \lor j = k \} $ \\
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 $ \\
{{ :lfa:2022:lfa2022_lab9_1_5.png?600 |}}
===== 9.2. Ambiguous grammars =====
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 $
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 $
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 $
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^*) $.
$ S \leftarrow aS | aaS | \epsilon $\\
Ambiguuous: yes\\
* S => aS => aaS => aa
* S => aaS => aa