430 likes | 615 Views
Context-Free Languages. Not all languages are regular. L 1 = {a n b n | n 0} is not regular. L 2 = { () , (()) , ((())) , ...} is not regular. some properties of programming languages. Context-Free Grammars. G = (V, T, S, P) Productions are of the form: A x
E N D
Context-Free Languages • Not all languages are regular. • L1 = {anbn | n 0} is not regular. L2 = {(), (()), ((())), ...} is not regular. some properties of programming languages
Context-Free Grammars G = (V, T, S, P) Productions are of the form: A x A V and x (V T)*
Context-Free Grammars • A regular language is also a context-free language.
Context-Free Grammars • A regular language is also a context-free language. • Why the name?
Example • G = ({S}, {a, b}, S, P) P = { S aSa S bSb S } S aSa aaSaa aabSbaa aabbaa
Example • G = ({S}, {a, b}, S, P) P = { S aSa S bSb S } S aSa aaSaa aabSbaa aabbaa L(G) = {wwR | w {a, b}*}
Example • G = ({S, A, B}, {a, b}, S, P) P = { S abB A aaBb B bbAa A } S abB abbbAa abbbaaBba abbbaabbAaba abbbaabbaba
Example • L = {anbm | n m} is context-free. G = (?, {a, b}, S, ?)
Example • L = {anbm | n m} is context-free. G = (?, {a, b}, S, ?) P = { S AS1 | S1B S1 aS1b | A aA | a B bB | b }
Example • G = ({S}, {a, b}, S, P) P = { S aSb | SS | } S aSb aaSbb aaSSbb aaabSbb aaababbb
Example • G = ({S}, {a, b}, S, P) P = { S aSb | SS | } S aSb aaSbb aaSSbb aaabSbb aaababbb L(G) = ?
Derivations • G = ({S, A, B}, {a, b}, S, {S AB, A aaA, A , B Bb, B }) 1 2 3 4 5 S AB aaAB aaB aaBb aab S AB ABb aaABb aaAb aab 1 2 3 4 5 1 4 2 5 3
Derivations • Leftmost: in each step the leftmost variable in the sentential form is replaced. • Rightmost: in each step the rightmost variable in the sentential form is replaced.
Example • G = ({S, A, B}, {a, b}, S, {S AB, A aaA, A , B Bb, B }) 1 2 3 4 5 S AB aaAB aaB aaBb aab leftmost S AB ABb aaABb aaAb aab 1 2 3 4 5 1 4 2 5 3
A a b A B c Derivation Trees A abABc ordered tree
Derivation Trees • Let G = (V, T, S, P) be a context-free grammar. An ordered tree is a derivation tree iff: • The root is labeled S. • Every leaf has a label from T {}. • Every interior vertex has a label from V. • A vertex has label AV and its children are labeled a1, a2, ..., an iff P contains the production A a1 a2 ... an. • A leaf labeled has no siblings.
Derivation Trees • Let G = (V, T, S, P) be a context-free grammar. An ordered tree is a partial derivation tree iff: • The root is labeled S. • Every leaf has a label from T {}. Every leaf has a label from V T {}. • Every interior vertex has a label from V. • A vertex has label AV and its children are labeled a1, a2, ..., an iff P contains the production A a1 a2 ... an. • A leaf labeled has no siblings.
Derivation Trees The string of symbols obtained by reading the leaves of a tree from left to right (omitting any 's encountered) is called the yield of the tree.
Derivation Trees S S aAB A bBb B A | yield: abbbb a A B b b B A b b B
Derivation Trees S S aAB A bBb B A | a A B b b B A b b B partial derivation tree
Sentential Forms & Derivation Trees • Let G = (V, T, S, P) be a context-free grammar. • wL(G) iff there exists a derivation tree of G whose yield is w. • If tG is a partial derivation tree of G whose root label is S, then the yield of tG is a sentential form of G.
Membership and Parsing • Membership algorithm: tells if wL(G). • Parsing: finding a sequence of productions by which wL(G) is derived.
Membership and Parsing S SS | aSb | bSa | w = aabb
Exhaustive Search Parsing • Top-down parsing. • S SS | aSb | bSa | w = aabb 1. S SS S SS SSS S aSb aSSb 2. S aSb S SS aSbS S aSb aaSbb 3. S bSa S SS bSaS S aSb abSab 4. S S SS S S aSb ab S aSb aaSbb aabb
Exhaustive Search Parsing • It is not efficient. • If w L(G) then it may never terminate, due to: A B A
Exhaustive Search Parsing Suppose G = (V, T, S, P) is a context-free grammar which does not have any rule of the form A B orA . Then the exhaustive search parsing method can decide if wL(G) or not.
Exhaustive Search Parsing Suppose G = (V, T, S, P) is a context-free grammar which does not have any rule of the form A B orA . Then the exhaustive search parsing method can decide if wL(G) or not. Proof: no more than |w| rounds are involved.
Exhaustive Search Parsing Suppose G = (V, T, S, P) is a context-free grammar which does not have any rule of the form A B orA . Then the exhaustive search parsing method can decide if wL(G) or not. Proof: no more than |w| rounds are involved. Complexity:|P||w|.
Theorem • For every context-free grammar G, there exists an algorithm that parses any wL(G) in a number of steps proportional to |w|3. • Not satisfactory as linear time parsing algorithm (proportional to the length of a string)
Simple Grammars (S-Grammars) G = (V, T, S, P) Productions are of the form: A ax A V, a T, and x V*, and any pair (A,a) can occur in at most one rule.
Simple Grammars (S-Grammars) Any wL(G) can be parsed in at most |w| steps. w = a1a2 ... an S a1A1A2 ... Am a1a2B1B2 ... BkA1A2 ... Am
Simple Grammars (S-Grammars) Many features of Pascal-like programming languages can be expressed with s-grammars.
Ambiguity A context-free grammar G is said to be ambiguous if there exits some wL(G) that has at least two distinct derivation trees.
Ambiguity S aSb | SS| w = aabb S S S S a b a b S S a b a b S S
Ambiguity • G = ({E, I}, {a, b, c, +, *, (, )}, E, P) w = a + b * c E I E E + E E E * E E (E) I a | b | c
Ambiguity • G = ({E, T, F, I}, {a, b, c, +, *, (, )}, E, P) w = a + b * c E T | E + T T F | T * F E E * E F I | (E) I a | b | c
Ambiguity If L is a context-free language for which there exists an unambiguous grammar, then L is said to be unambiguous.
Ambiguity If L is a context-free language for which there exists an unambiguous grammar, then L is said to be unambiguous. If every grammar that generates L is ambiguous, then L is called inherently ambiguous.
Ambiguity • L = {anbncm} {anbmcm} is inherently ambiguous. L = L1 L2 S S1 | S2 S1 S1c | A S2 aS2 | B A aAb | B bBc |
CFGs and Programming Languages • Important uses of formal languages: • to define precisely a programming language. • to construct an efficient translator for it. • RLs are used for simple patterns, while CFLs for more complicated aspects.
CFGs and Programming Languages • S-grammars: <if-statement> ::= if <expression> <then_clause> <else_clause> <then_clause> ::= then <statement> <else_clause> ::= else <statement>
Homework • Exercises: 2, 3, 4, 6, 7, 9, 15, 17, 22 of Section 5.1 - Linz’s book. • Exercises: 1, 2, 5, 6, 8, 10, 11, 12, 13, 15 of Section 5.2 - Linz’s book. • Exercises: 1, 2, 3 of Section 5.3 - Linz’s book.