This document discusses parsing and context-free grammars. It defines parsing as verifying that tokens generated by a lexical analyzer follow syntactic rules of a language using a parser. Context-free grammars are defined using terminals, non-terminals, productions and a start symbol. Top-down and bottom-up parsing are introduced. Techniques for grammar analysis and improvement like left factoring, eliminating left recursion, calculating first and follow sets are explained with examples.
What is Parsing? •In the syntax analysis phase, a compiler verifies whether or not the tokens generated by the lexical analyzer are grouped according to the syntactic rules of the language. • This is done by a parser. • It detects and reports any syntax errors and produces a parse tree from which intermediate code can be generated.
Context-Free Grammars • Terminals- Basic symbols from which strings are formed. • Non-terminals - Syntactic variables that denote sets of strings. • Start Symbol - Denotes the nonterminal that generates strings of the languages • Productions - A = X … X - Head/left side (A) is a nonterminal - Body/right side (X … X) zero or more terminals and non- terminals
CFG Notation • A,B, C: non-terminals • l: terminals • a, b, c: strings of non-terminals and terminals • (alpha, beta, gamma in math) • w, v: strings of terminal symbols
7.
Derivations • Derivation -derives in zero or more steps • E =>* "-" "(" ID "+" ID ")" • Derivation step: replace symbol by RHS of production. • Repeatedly apply derivations
Types of Parser •The process of deriving the string from the given grammar is known as derivation (parsing). • Depending upon how derivation is done we have two kinds of parsers :- • Top Down Parser • Bottom Up Parser
10.
Top Down Parser •Top down parsing attempts to build the parse tree from root to leave. • Top down parser will start from start symbol and proceeds to string. • It follows leftmost derivation.
11.
Bottom Up Parser •Bottom-up parsing starts from the leaf nodes of a tree and works in upward direction till it reaches the root node. • Here, we start from a sentence and then apply production rules in reverse manner in order to reach the start symbol.
Left Factoring -Examples Consider the following grammar:- • S → iEtS / iEtSeS / a • E → b Solution:- • S → iEtSS’ / a • S’ → eS / ∈ • E → b
14.
Left Factoring -Examples Consider the following grammar:- • A → aAB / aBc / aAc Solution:- • A → aA’ • A’ → AB / Bc / Ac // This has to done again • A → aA’ • A’ → AD / Bc • D → B / c
15.
Left Factoring -Examples Consider the following grammar:- • S → aAd / aB • A → a / ab • B → ccd / ddc Solution:- • S → aS’ • S’ → Ad / B • A → aA’ • A’ → b / ∈
Left Recursion -Examples Consider the following grammar - • A → ABd / Aa / a • B → Be / b The grammar after eliminating left recursion is- • A → aA’ • A’ → BdA’ / aA’ / ∈ • B → bB’ • B’ → eB’ / ∈
18.
Left Recursion -Examples Consider the following grammar and eliminate left recursion- • E → E + E / E x E / a The grammar after eliminating left recursion is- • E → aA • A → +EA / xEA / ∈
19.
Left Recursion -Examples • Consider the following grammar and eliminate left recursion- • E → E + T / T • T → T x F / F • F → id • E → E + T • E → T • T → T x F • T → F • F → id OR
20.
Left Recursion -Examples The grammar after eliminating left recursion is- • E → TE’ • E’ → +TE’ / ∈ • T → FT’ • T’ → xFT’ / ∈ • F → id
21.
First & Follow •FIRST(X) for a grammar symbol X is the set of terminals that begin the strings derivable from X. • Follow(X) to be the set of terminals that can appear immediately to the right of Non-Terminal X in some sentential form. • Why calculate FIRST? – It is useful to calculate FOLLOW. – Both are useful in parsing (both Top-Down and Bottom- Up)
22.
First & FollowRules Rules to compute FIRST set:- • If x is a terminal, then FIRST(x) = { ‘x’ } • If x-> Є, is a production rule, then add Є to FIRST(x). • If X->Y1 Y2 Y3….Yn is a production, then FIRST(X) = FIRST(Y1) • If FIRST(Y1) contains Є then FIRST(X) = { FIRST(Y1) – Є } U { FIRST(Y2) } • If FIRST (Yi) contains Є for all i = 1 to n, then add Є to FIRST(X).
23.
First - Examples Calculatethe first functions for the given grammar- • S → aBDh • B → cC • C → bC / ∈ • D → EF • E → g / ∈ • F → f / ∈
24.
First - Examples •First(S) = { a } • First(B) = { c } • First(C) = { b , ∈ } • First(D) = { First(E) – ∈ } ∪ First(F) = { g , f , ∈} • First(E) = { g , ∈ } • First(F) = { f , ∈ }
25.
First - Examples Calculatethe first functions for the given grammar- • S → A • A → aB / Ad • B → b • C → g
26.
First - Examples •First(S) = First(A) = { a } • First(A) = { a } • First(A’) = { d , ∈ } • First(B) = { b } • First(C) = { g }
27.
First & FollowRules Rules to compute FOLLOW set:- • Follow(S) = {$} where S is the start symbol. • If A->pBq is a production where p, B, q any grammar symbols then everything in FIRST(q) except Є is in FOLLOW(B). • If A->pB is a production or a production A->pBq where FIRST(q) contains Є then everything in FOLLOW(A) is in FOLLOW(B).
28.
Follow - Examples Calculatethe follow functions for the given grammar- • S → aBDh • B → cC • C → bC / ∈ • D → EF • E → g / ∈ • F → f / ∈
29.
Follow - Examples •Follow(S) = { $ } • Follow(B) = { First(D) – ∈ } ∪ First(h) = { g , f , h } • Follow(C) = Follow(B) = { g , f , h } • Follow(D) = First(h) = { h } • Follow(E) = { First(F) – ∈ } ∪ Follow(D) = { f , h } • Follow(F) = Follow(D) = { h }
30.
Follow - Examples Calculatethe follow functions for the given grammar- • S → A • A → aB / Ad • B → b • C → g
First & Follow- Examples • Calculate the first and follow functions for the given grammar- • S → AaAb / BbBa • A → ∈ • B → ∈
33.
First & Follow- Examples • First(S) = { First(A) – ∈ } ∪ First(a) ∪ { First(B) – ∈ } ∪ First(b) = { a , b } • First(A) = { ∈ } • First(B) = { ∈ } • Follow(S) = { $ } • Follow(A) = First(a) ∪ First(b) = { a , b } • Follow(B) = First(b) ∪ First(a) = { a , b }
34.
First & Follow- Examples Calculate the first and follow functions for the given grammar- • E → E + T / T • T → T x F / F • F → (E) / id
35.
First & Follow- Examples • The given grammar is left recursive. After eliminating left recursion, we get - • E → TE’ • E’ → + TE’ / ∈ • T → FT’ • T’ → x FT’ / ∈ • F → (E) / id
36.
First & Follow- Examples • First(E) = First(T) = First(F) = { ( , id } • First(E’) = { + , ∈ } • First(T) = First(F) = { ( , id } • First(T’) = { x , ∈ } • First(F) = { ( , id }