






























Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
Community
Ask the community for help and clear up your study doubts
Discover the best universities in your country according to Docsity users
Free resources
Download our free guides on studying techniques, anxiety management strategies, and thesis advice from Docsity tutors
all the topics under atc mod 3 is covered
Typology: Study notes
1 / 38
This page cannot be seen from the preview
Don't miss anything!
i. Context-Free Grammars(CFG): Introduction to Rewrite Systems and Grammars ii. CFGs and languages, designing CFGs, iii. Simplifying CFGs, iv. Proving that a Grammar is correct, v. Derivation and Parse trees, Ambiguity, vi. Normal Forms. vii. Pushdown Automata (PDA): Definition of non-deterministic PDA, viii. Deterministic and Non-deterministic PDAs, ix. Non-determinism and Halting, Alternative equivalent definitions of a PDA, x. Alternatives those are not equivalent to PDA. Text Books:
Learning Outcomes: At the end of the module student should be able to: Sl.No TLO’s
What is Rewrite System? A rewrite system (or production system or rule based system) is a list of rules, and an algorithm for applying them. Each rule has a left-hand side and a right hand side. X → Y (LHS) (RHS) Examples of rewrite-system rules: S aSb, aS , aSb bSabSa When a rewrite system R is invoked on some initial string w, it operates as follows: simple-rewrite(R: rewrite system, w: initial string) =
When to Stop Case 1: The working string no longer contains any nonterminal symbols (including, when it is ). In this case, we say that the working string is generated by the grammar. Example: S ⇒ aSb ⇒ aaSbb ⇒ aabb Case 2: There are nonterminal symbols in the working string but none of them appears on the left-hand side of any rule in the grammar. In this case, we have a blocked or non-terminated derivation but no generated string. Given: S aSb S bTa S ----- rule 1 ----- rule 2 ----- rule 3 Derivation so far: S ⇒ aSb ⇒ abTab ⇒ Case 3: It is possible that neither case 1 nor case 2 is achieved. Given: S Ba ------------ rule 1 B bB ------------ rule 2 Then all derivations proceed as: S ⇒ Ba ⇒ bBa ⇒ bbBa ⇒ bbbBa ⇒ bbbbBa ⇒ ... The grammar generates the language Ø.
Recall Regular Grammar which has a left-hand side that is a single nonterminal and have a right-hand side that is or nonterminal. a single terminal or a single terminal followed by a single X → Y ( NT) ( or T or T NT) Example: L = {w Î {a, b}* : |w| is even} RE = ((aa) (ab) (ba) (bb))* Context Free Grammars X → Y (NT) (No restriction) No restrictions on the form of the right hand sides. But require single non-terminal on left hand side. Example: S , S a, S T, S aSb, S aSbbT are allowed. ST aSb, a aSb, a are not allowed. The name for these grammars “Context Free” makes sense because using these rules the decision to replace a nonterminal by some other sequence is made without looking at the context in which the nonterminals occurs.
Definition Context-Free Grammar A context-free grammar G is a quadruple, (V, , R, S), where:
Example2: A CFG for C++ compound statements:
If L has a property that every string in it has two regions & those regions must bear some relationship to each other, then the two regions must be generated in tandem. Otherwise, there is no way to enforce the necessary constraint.
Example 1: L = {anbncm^ : n, m ≥ 0} = L = {, ab, c, abc, abcc, aabbc, …….} The cm^ portion of any string in L is completely independent of the anbn^ portion, so we should generate the two portions separately and concatenate them together. G = ({S, A, C, a, b, c}, {a, b, c}, R, S} where: R = { S AC /* generate the two independent portions A aAb | /* generate the anbn^ portion, from the outside in C cC | } /* generate the cm^ portion Example derivation in G for string abcc: S ⇒ AC ⇒ aAbC ⇒ abC ⇒ abcC ⇒ abccC ⇒ abcc Example 2: L={ aibjck^ : j=i+k, i ,k ≥ 0} on substituting j=i+k ⇒ L = {aibibkck^ : i, k ≥ 0} L = {, abbc, aabbbbcc, abbbcc …….} The aibi^ portion of any string in L is completely independent of the bkck^ portion, so we should generate the two portions separately and concatenate them together. G = ({S, A, B, a, b, c}, {a, b, c}, R, S} where: R = { S AB /* generate the two independent portions A aAb | /* generate the aibi^ portion, from the outside in B bBc | } /* generate the bkck^ portion Example derivation in G for string abbc: S ⇒ AB ⇒ aAbB ⇒ abB ⇒ abbBc ⇒ abbc Example 3: L={ aibjck^ : i=j+k, j ,k ≥0} on substituting i=j+k ⇒ L = {akajbjck^ : j, k ≥0} L = {, ac, ab, aabc, aaabcc, …….} The aibi^ is the inner portion and akck^ is the outer portion of any string in L. G = ({S, A, a, b, c}, {a, b, c}, R, S} where: R = { S aSc | A /* generate the akck^ outer portion A aAb | /* generate the ajbj^ inner portion} Example derivation in G for string aabc: S ⇒ aSc ⇒ aAc ⇒ aaAbc ⇒ aabc Example 4: L = {anwwR^ bn: w {a, b}*} = {, ab, aaab, abbb, aabbab, aabbbbab, ........... } The anbn^ is the inner portion and wwR^ is the outer portion of any string in L. G = {{S, A, a, b}, {a, b}, R, S}, where: R = {S aSb ------------ rule 1 S A --------------- rule 2 A aAa ------------ rule 3 A bAb ----------- rule 4 A --------------- rule 5 }. Example derivation in G for string aabbab: S ⇒ aSb ⇒ aAb ⇒ aaAab ⇒ aabAbab ⇒ aabbab
Example: G = ({S, A, B, C, D, a, b}, {a, b}, R, S), where R = { S AB | AC A aAb | B bA C bCa D AB }
Given some language L and a grammar G, can we prove that G is correct (ie it generates exactly the strings in L) To do so, we need to prove two things:
Algorithms used for generation and recognition must be systematic. The expansion order is important for algorithms that work with CFG. To make it easier to describe such algorithms, we define two useful families of derivations. a. A leftmost derivation is one in which, at each step, the leftmost nonterminal in the working string is chosen for expansion. b. A rightmost derivation is one in which, at each step, the rightmost nonterminal in the working string is chosen for expansion. Example 1 : S → AB | aaB A → a | Aa B → b Left-most derivation for string aab is S ⇒ AB ⇒ AaB ⇒ aaB ⇒ aab Right-most derivation for string aab is S ⇒ AB ⇒ Ab ⇒ Aab ⇒ aab Example 2: SiCtS | iCtSeS | x Cy Left-most Derivation for string iytiytxex is S ⇒ iCtS ⇒ iytS ⇒ iytiCtSeS ⇒ iytiytSeS ⇒ iytiytxe ⇒ iytiytxex Right-most Derivation for string iytiytxex is S ⇒ iCtSeS ⇒ iCtSex ⇒ iCtiCtSex ⇒ iCtiCtxex ⇒ iCtiytxex ⇒ iytiytxex Example 3: A Fragment of English Grammar are S NP VP NP the Nominal | a Nominal | Nominal | ProperNoun | NP PP Nominal N | Adjs N N cat | dogs | bear | girl | chocolate | rifle ProperNoun Chris | Fluffy Adjs Adj Adjs | Adj Adj young | older | smart VP V | V NP | VP PP V like | likes | thinks | shots | smells PP Prep NP Prep with
Example 1: S AB | aaB A a | Aa B b Left-most derivation for the string aab is S ⇒ AB ⇒ AaB ⇒ aaB ⇒ aab Parse tree obtained is Example 2: SiCtS | iCtSeS | x Cy Left-most Derivation for string iytiytxex isS ⇒ iCtS ⇒ iytS ⇒ iytiCtSeS ⇒ iytiytSeS ⇒ iytiytxeS ⇒ iytiytxex Example 3: Parse Tree - Structure in English for the string “the smart cat smells chocolate”. It is clear from the tree that the sentence is not about cat smells or smart cat smells. the smart cat smells chocolate A parse tree may correspond to multiple derivations. From the parse tree, we cannot tell which of the following is used in derivation: S ⇒ NP VP ⇒ the Nominal VP ⇒ S ⇒ NP VP ⇒ NP V NP ⇒ Parse trees capture the important structural facts about a derivation but throw away the details of the nonterminal expansion order. The order has no bearing on the structure we wish to assign to a string. Generative Capacity Because parse trees matter, it makes sense, given a grammar G, to distinguish between:
Sometimes a grammar may produce more than one parse tree for some (or all ) of the strings it generates. When this happens we say that the grammar is ambiguous. A grammar is ambiguous iff there is at least one string in L(G) for which G produces more than one parse tree.
Example 1: Bal={w { ),(}*: the parenthesis are balanced}. G={{S,),( }, {),(},R,S} where R={ S S SS S (S) } Left-most Derivation1 for the string (())() is S ⇒ S⇒(S)S ⇒ ((S))S ⇒ (())S ⇒ (())(S) ⇒ (())() Left-most Derivation2 for the string (())() is S ⇒ SS ⇒SSS ⇒SS ⇒ (S)S ⇒ ((S))S ⇒ (())S ⇒ (())(S) ⇒ (())() Since both the parse trees obtained for the same string (())() are different, the grammar is ambiguous. Example 2: S iCtS | iCtSeS | x C y Left-most Derivation for the string iytiytxex is S ⇒ iCtS ⇒ iytS ⇒ iytiCtSeS ⇒ iytiytSeS ⇒ iytiytxeS ⇒ iytiytxex Right-most Derivation for the string iytiytxex is S ⇒ iCtSeS ⇒ iCtSex ⇒ iCtiCtSex ⇒iCtiCtxex ⇒ iCtiytxex ⇒ iytiytxex Since both the parse trees obtained for the same string iytiytxex are different, the grammar is ambiguous. Example 3: S AB | aaB A a | Aa B b Left-most derivation for string aab is S ⇒ AB ⇒ AaB ⇒ aaB ⇒ aab Right-most derivation for string aab is S ⇒ aaB ⇒ aab Since both the parse trees obtained for the same string aab are different, the grammar is ambiguous.
a. Eliminating ε-Rules Let G =(V, , R, S) be a CFG. The following algorithm constructs a G such that L(G ) = L(G)-{} and G contains no rules: removeEps(G: CFG) =
What If ε ∈ L? Sometimes L(G) contains and it is important to retain it. To handle this case the algorithm used is atmostoneEps(G: CFG) =
The new grammar built is better than the original one. The string (())() has only one parse tree. But it is still ambiguous as the string ()()() has two parse trees? Replace S SS with one of: S S S 1 /* force branching to the left S S 1 S /* force branching to the right So we get: S* | S S SS 1 /* force branching only to the left S S 1 /* add rule S 1 (S) | ()
Proving that the grammar is Unambiguous A grammar is unambiguous iff for all strings w, at every point in a leftmost derivation or rightmost derivation of w, only one rule in G can be applied. S* ---(1) S* S ---(2) S SS 1 ---(3) S S 1 ---(4) S 1 (S) ---(5) S 1 () ---(6) S* ⇒ S ⇒SS 1 ⇒SS 1 S 1 ⇒S 1 S 1 S 1 ⇒ () S 1 S 1 ⇒ () () S 1 ⇒ () () () Inherent Ambiguity In many cases, for an ambiguous grammar G, it is possible to construct a new grammar G that generate L(G) with less or no ambiguity. However, not always. Some languages have the property that every grammar for them is ambiguous.We call such languages inherently ambiguous. Example: L = {aibjck: i, j , k 0, i=j or j=k}. Every string in L has either (or both) the same number of a’s and b’s or the same number of b’s and c’s. L = {anbncm: n, m 0} {anbmcm: n, m 0}. One grammar for L has the rules: S S 1 | S 2 S 1 S 1 c | A /* Generate all strings in {anbncm}. A aAb | S 2 aS 2 | B /* Generate all strings in {anbmcm}. B bBc | Consider the string a^2 b^2 c^2. It has two distinct derivations, one through S 1 and the other through S 2 S ⇒ S 1 ⇒ S 1 c⇒ S 1 cc ⇒ Acc ⇒ aAbcc ⇒ aaAbbcc ⇒ aabbcc S ⇒ S 2 ⇒ aS 2 ⇒ aaS 2 ⇒ aaB ⇒ aabBc ⇒ aabbBcc⇒ aabbcc Given any grammar G that generates L, there is at least one string with two derivations in G. Both of the following problems are undecidable:
We have seen in some grammar where RHS is , it makes grammar harder to use. Lets see what happens if we carry the idea of getting rid of - productions a few steps farther. To make our tasks easier we define normal forms. Normal Forms - When the grammar rules in G satisfy certain restrictions, then G is said to be in Normal Form.