Professional Documents
Culture Documents
PARSER
MODEL OF COMPILER FRONT END 2
Front End
Syntax analysis
If the top of the stack is a non-terminal, replace the top of the stack with one of
the productions for that non-terminal, using the next k input symbols to decide
which one (without moving the input cursor), and continue.
If the top of the stack is a terminal, read the next input token. If it is the same
terminal, pop the stack and continue. Otherwise, the parse has failed and the
algorithm finishes.
If the stack is empty, the parse has succeeded and the algorithm finishes. (We
assume that there is a unique EOF-marker $ at the end of the input.)
So look ahead meaning is - looking at input tokens without moving the input
cursor.
PRIME REQUIREMENT OF LL(1) 8
For example :
the input string is - aab & grammar is
S ->aAb|aA|ab
A ->bAc|ab
After removing left factoring -
S ->aA’
A’ ->Ab|A|b
A ->ab|bAc
12
RECURSION
RECURSION:
The process in which a function calls itself directly or indirectly is called recursion
and the corresponding function is called as recursive function.
TYPES OF RECURSION
Right recursion does not create any problem for the top
down parsers.
How could the parser decide how many times to use the production A
A before using the production A --> ?
E T E'
TT*F|F
E' + T E' |
F (E) | id T F T'
Apply the transformation to E:
T' * F T' |
E T E'
E' + T E' | F (E) | id
S → XSS′ | aS′
Apply the transformation to S: S′ → XS′ | SbS′ | ε
X → SaX′
S → XSS′ | aS′
X′ → bX′ | ε
S′ → XS′ | SbS′ | ε
Apply the transformation to X:
X → SaX′
X′ → bX′ | ε
Example of elimination indirect left 22
recursion:
S A A | 0
A S S | 1
Considering the ordering S, A, we get:
S A A | 0
A S | 0S | 1
If a grammar is
A → aB ǀ ε then FIRST ( A )={ a, ε }
If a grammar is
A → BcD ǀ ε
B → eD ǀ ( A )
Rules of FOLLOW
If a grammar is
A → BA’
A' →*Bc
Here we see that there is nothing at the right side of A' . So
FOLLOW ( A' )= FOLLOW ( A )= { $ }
Because A' follows the start symbol.
29
Rules of FOLLOW
If a grammar is
A → BC
B → Td
C →*D ǀ ε
When we want to find FOLLOW (B),we see that B follows by C . Now
put the FIRST( C) in the there.
FIRST(C)={*, ε }.
But when the value is € it follows the parents symbol. So
FOLLOW(B)={*,$ }
30
Example of FIRST and FOLLOW
GRAMMAR:
E -> TE'
E'-> +TE'|ε Symbol FIRST FOLLOW
T -> FT'
T' -> *FT'|ε E
F -> (E)|id
E’
T’
F
31
Example of FIRST and FOLLOW
GRAMMAR:
E -> TE'
E'-> +TE'|ε Symbol FIRST FOLLOW
T -> FT'
T' -> *FT'|ε E { ( , id }
F -> (E)|id
E'
T'
F
32
Example of FIRST and FOLLOW
GRAMMAR:
E -> TE'
E'-> +TE'|ε Symbol FIRST FOLLOW
T -> FT'
T' -> *FT'|ε E { ( , id }
F -> (E)|id
E' {+,ε}
T'
F
33
Example of FIRST and FOLLOW
GRAMMAR:
E -> TE'
E'-> +TE'|ε Symbol FIRST FOLLOW
T -> FT'
T' -> *FT'|ε E { ( , id }
F -> (E)|id
E' {+,ε}
T { id , ( }
T'
F
34
Example of FIRST and FOLLOW
GRAMMAR:
E -> TE'
E'-> +TE'|ε Symbol FIRST FOLLOW
T -> FT'
T' -> *FT'|ε E { ( , id }
F -> (E)|id
E' {+,ε}
T { id , ( }
T' {*,ε }
F
35
Example of FIRST and FOLLOW
GRAMMAR:
E -> TE'
E'-> +TE'|ε Symbol FIRST FOLLOW
T -> FT'
T' -> *FT'|ε E { ( , id }
F -> (E)|id
E' {+,ε}
T { id , ( }
T' {*,ε}
F { id , ( }
36
Example of FIRST and FOLLOW
GRAMMAR:
E -> TE'
E'-> +TE'|ε Symbol FIRST FOLLOW
T -> FT'
T' -> *FT'|ε E { ( , id } {$,)}
F -> (E)|id
E' {+,ε}
T { id , ( }
T' {*,ε}
F { id , ( }
37
Example of FIRST and FOLLOW
GRAMMAR:
E -> TE'
E'-> +TE'|ε Symbol FIRST FOLLOW
T -> FT'
T' -> *FT'|ε E { ( , id } {$,)}
F -> (E)|id
E' {+,ε} {$,)}
T { id , ( }
T' {*,ε }
F { id , ( }
38
Example of FIRST and FOLLOW
GRAMMAR:
E -> TE'
E'-> +TE'|ε Symbol FIRST FOLLOW
T -> FT'
T' -> *FT'|ε E { ( , id } {$,)}
F -> (E)|id
E' {+,ε} {$,)}
T { id , ( } { $ , ) ,+ }
T' {*,ε }
F { id , ( }
39
Example of FIRST and FOLLOW
GRAMMAR:
E -> TE'
E'-> +TE'|ε Symbol FIRST FOLLOW
T -> FT'
T' -> *FT'|ε E { ( , id } {$,)}
F -> (E)|id
E' {+,ε} {$,)}
T { id , ( } { $ , ) ,+ }
F { id , ( }
40
Example of FIRST and FOLLOW
GRAMMAR:
E -> TE'
E'-> +TE'|ε Symbol FIRST FOLLOW
T -> FT'
T' -> *FT'|ε E { ( , id } {$,)}
F -> (E)|id
E' {+,ε} {$,)}
T { id , ( } { $ , ) ,+ }
F { id , ( } {$,),+,*}
41
E -> TE’
E’ -> +TE’|ε
T -> FT’
T’ -> *FT’|ε
F -> (E)|id
43
Production Symbol FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
INPUT SYMBOLS
Terminal
TABLE: id + * ( ) $
PARSING E
TABLE E’
T
T’
F
44
Production Symbol FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
INPUT SYMBOLS
Terminal
id + * ( ) $
TABLE:
PARSING E E -> TE’
TABLE E’
T
T’
F
45
Production Symbol FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
INPUT SYMBOLS
Terminal
id + * ( ) $
TABLE:
PARSING E E -> TE’ E -> TE’
TABLE E’
T
T’
F
46
Production Symbol FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
INPUT SYMBOLS
Terminal
id + * ( ) $
TABLE:
E E -> TE’ E -> TE’
PARSING
TABLE E’ E’-> +TE’
T
T’
F
47
Production Symbol FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
INPUT SYMBOLS
Terminal
id + * ( ) $
TABLE:
E E -> TE’ E -> TE’
PARSING
TABLE E’ E’-> +TE’ E’ -> ε E’ -> ε
T
T’
F
48
Production Symbol FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
INPUT SYMBOLS
Terminal
id + * ( ) $
TABLE:
E E -> TE’ E -> TE’
PARSING
TABLE E’ E’-> +TE’ E’ -> ε E’ -> ε
T T -> FT’
T’
F
49
Production Symbol FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
INPUT SYMBOLS
Terminal
id + * ( ) $
TABLE:
E E -> TE’ E -> TE’
PARSING
E’ E’-> +TE’ E’ -> ε E’ -> ε
TABLE
T T -> FT’ T -> FT’
T’
F
50
Production Symbol FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
INPUT SYMBOLS
Terminal
id + * ( ) $
TABLE: E E -> TE’ E -> TE’
PARSING E’ E’-> +TE’ E’ -> ε E’ -> ε
TABLE
T T -> FT’ T -> FT’
T’ T’ -> *FT’
F
51
Production Symbol FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
INPUT SYMBOLS
Terminal
id + * ( ) $
TABLE: E E -> TE’ E -> TE’
PARSING E’ E’-> +TE’ E’ -> ε E’ -> ε
TABLE
T T -> FT’ T -> FT’
F
52
Production Symbol FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
INPUT SYMBOLS
Terminal
id + * ( ) $
TABLE: E E -> TE’ E -> TE’
PARSING E’ E’-> +TE’ E’ -> ε E’ -> ε
TABLE
T T -> FT’ T -> FT’
F F -> id
53
Production Symbol FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
INPUT SYMBOLS
Terminal
id + * ( ) $
TABLE: E E -> TE’ E -> TE’
PARSING E’ E’-> +TE’ E’ -> ε E’ -> ε
TABLE
T T -> FT’ T -> FT’
Continue…
Non
INPUT SYMBOLS
Terminal
id + * ( ) $
E E -> TE’ E -> TE’
E’ E’-> +TE’ E’ -> ε E’ -> ε
T T -> FT’ T -> FT’
T’ T’ -> ε T’ -> *FT’ T’ -> ε T’ -> ε
F F -> id F -> (E)
Continue…
Continue…
S’ e,ε $,e
Eb
E b t
57
SYMBOL FIRST FOLLOW
S iEtSS’ | a
a,i $,e
TABLE:
S’ eS |ε
e, ε $,e FAST & FOLLOW
Eb
b t
Non
INPUT SYMBOLS
Terminal
a b e i t $
TABLE:
S
PARSING TABLE
S’
E
58
SYMBOL FIRST FOLLOW
S iEtSS’ | a
a,i $,e
TABLE:
S’ eS |ε
e, ε $,e FAST & FOLLOW
Eb
b t
Non
INPUT SYMBOLS
Terminal
a b e i t $
TABLE:
S Sa
PARSING TABLE
S’
E
59
SYMBOL FIRST FOLLOW
S iEtSS’ | a
a,i $,e
TABLE:
S’ eS |ε
e, ε $,e FAST & FOLLOW
Eb
b t
Non
INPUT SYMBOLS
Terminal
a b e i t $
TABLE:
SiEtSS
PARSING TABLE S Sa
’
S’
E
60
SYMBOL FIRST FOLLOW
S iEtSS’ | a
a,i $,e
TABLE:
S’ eS |ε
e, ε $,e FAST & FOLLOW
Eb
b t
Non
INPUT SYMBOLS
Terminal
a b e i t $
TABLE:
SiEtSS
PARSING TABLE S Sa
’
S’ S’ eS
E
61
SYMBOL FIRST FOLLOW
S iEtSS’ | a
a,i $,e
TABLE:
S’ eS |ε
e, ε $,e FAST & FOLLOW
Eb
b t
Non
INPUT SYMBOLS
Terminal
a b e i t $
TABLE:
SiEtSS
PARSING TABLE S Sa
’
S’ eS
S’ S’ε
S’ε
E
62
SYMBOL FIRST FOLLOW
S iEtSS’ | a
a,i $,e
TABLE:
S’ eS |ε
e, ε $,e FAST & FOLLOW
Eb
b t
Non
INPUT SYMBOLS
Terminal
a b e i t $
TABLE:
SiEtSS
PARSING TABLE S Sa
’
S’ eS
S’ S’ε
S’ε
E Eb
63
SYMBOL FIRST FOLLOW
S iEtSS’ | a
a,i $,e
TABLE:
S’ eS |ε
e, ε $,e FAST & FOLLOW
Eb
b t
Non
INPUT SYMBOLS
Terminal
a b e i t $
TABLE:
SiEtSS
PARSING TABLE S Sa
’
S’ eS
S’ S’ε
S’ε
AMBIGUITY
E Eb
Continue… 64
STACK Implementation
LL(1) Stack
1. X a $,
the parser halts and annouces successful completion.
2. Xa$
the parser pops x off the stack and advances input pointer to next
input symbol
3. If X is a nonterminal, the program consults entry M[x,a] of parsing
table M.
If the entry is a production M[x,a] = {x → uvw } then the
parser replaces x on top of the stack by wvu (with u on top).
LL(1) Stack
Grammar: Example:
E -> TE' Let’s parse the input
E'-> +TE'|ε string
T -> FT'
T' -> *FT'|ε id+idid
F -> (E)|id Using the nonrecursive
LL(1) parser
71
id + id id $
E
$
stack Parsing
Table
Parsing Table
72
id + * ( ) $
E E →TE' E →TE'
E
$
E →T E'
stack Parsing
Table
74
id + id id $
T
E'
$
→ F T'
Non
Terminal
TParsing INPUT SYMBOLS
stack id
E -> TE’
+ * (
E -> TE’
) $
Table M
E
F
T'
E'
$ Non
Terminal
→ id
FParsing INPUT SYMBOLS
stack id
E -> TE’
+ * (
E -> TE’
) $
Table M
E
id
T'
E'
$ Non
Terminal
INPUT SYMBOLS
stack id
Parsing
+ * ( ) $
E -> TE’ E -> TE’
Table M
E
T'
E'
$ Non
Terminal
→
T'Parsing INPUT SYMBOLS
stack id
E -> TE’
+ * (
E -> TE’
) $
Table M
E
E'
$
→ +T E'
Non
INPUT SYMBOLS
E'Parsing
Terminal
stack id
E -> TE’
+ * (
E -> TE’
) $
Table M
E
+
T
E'
$ Non
Terminal
INPUT SYMBOLS
stack id
Parsing
+ * ( ) $
E -> TE’ E -> TE’
Table M
E
E'
T
+ E'
F T' T
id F T'
id * F T'
DONE…
id