LL 1
LL 1
PARSER
PARSING
▶ 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.
So look ahead meaning is - looking at input tokens without moving the input
cursor.
PRIME REQUIREMENT OF
LL(1)
▶ 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
STEP: LEFT RECURSION
RECURSION
RECURSION:
TYPES OF RECURSION
How could the parser decide how many times to use the
production A
A before using the production A --> ?
X → Xb | Now the
Sa grammar is
S → XS′S′ | aS′
Apply the transformation to S:
S′ → XS′ | SbS′ | ε
S → XS′S′ | aS′ X → SaX’
S′ → XS′ | SbS′ | ε X′ → bX′ | ε
A → BcD ǀ ε
B → eD ǀ ( A
)
Here B is non terminal. So, we check the
transition of B and find the FIRST of A.
then FIRST ( A )={ e,( , ε }
RULES OF
FOLLOW
For doing FOLLOW operation we need FIRST operation mostly. In
FOLLOW we use a $ sign for the start symbol. FOLLOW always
check the right
portion of the symbol.
If a grammar is
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.
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)={*, ε }.
EXAMPLE OF FIRST AND
FOLLOW
GRAMMAR:
E -> TE'
E'-> +TE' | Symbol FIRST FOLLOW
ε
T -> FT' E
T' -> *FT' |
ε F -> E’
(E) |id
T
T’
F
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
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
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
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
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 , ( }
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 , ( }
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 , ( }
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 , ( }
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 , ( }
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 , ( } {$,),+,*}
STEP: PARSING TABLE
EXAMPLE OF LL(1)
GRAMMAR
E -> TE’
E’ -> +TE’ | ε
T -> FT’
T’ -> *FT’ | ε
F -> (E) | id
Production FIRST FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
Termin TAB
INPUT SYMBOLS
al
LE:
TABLE: id + * ( ) $
PARSING E FIRST
TABLE E’
&
T
T’ FOLLO
F W
Production FIRST FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
TAB
Non
INPUT SYMBOLS
Termin
al
LE:
TABLE: id + * ( ) $
F -> (E)|id { ( , id } { *, + , $ , ) }
TAB
Non
INPUT SYMBOLS
Termin
al
LE:
TABLE: id + * ( ) $
F -> (E)|id { ( , id } { *, + , $ , ) }
TAB
Non
INPUT SYMBOLS
Termin
al
id + LE:
* ( ) $
TABLE:
PARSING E E -> TE’ FIRSTE -> TE’
TABLE E’ E’-> +TE’ &
T
T’
FOLLO
F W
Production FIRST FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
TAB
Non
INPUT SYMBOLS
Terminal
id + LE:
* ( ) $
TABLE:
PARSING E E -> TE’ FIRSTE -> TE’
TABLE E’ E’-> +TE’ & E’ -> ε E’ -> ε
T
T’
FOLLO
F
W
Production FIRST FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
TAB
Non
INPUT SYMBOLS
Terminal
id + LE:
* ( ) $
TABLE:
PARSING E E -> TE’ FIRSTE -> TE’
TABLE E’ E’-> +TE’ & E’ -> ε E’ -> ε
T
T’
T -> FT’
FOLLO
F
W
Production FIRST FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
TAB
Non
INPUT SYMBOLS
Termin
al
id + LE:* ( ) $
TABLE:
PARSING
E E -> TE’
FIRST E -> TE’
TABLE
E’ E’-> +TE’
& E’ -> ε E’ -> ε
FOLLO
T T -> FT’ T -> FT’
T’
F
W
Production FIRST FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
Termin
al
TAB
INPUT SYMBOLS
id + LE: * ( ) $
TABLE:
PARSING
E E -> TE’
FIRST E -> TE’
T’ FOLLO
T’ -> *FT’
F
W
Production FIRST FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
Termin
al
TAB
INPUT SYMBOLS
id + LE: * ( ) $
TABLE:
PARSING
E E -> TE’
FIRST E -> TE’
T’ T’ -> ε FOLLO
T’ -> *FT’ T’ -> ε T’ -> ε
F
W
Production FIRST FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
Termin
al
TAB
INPUT SYMBOLS
id + LE: * ( ) $
TABLE:
PARSING
E E -> TE’
FIRST E -> TE’
T’ T’ -> ε FOLLO
T’ -> *FT’ T’ -> ε T’ -> ε
F F -> id
W
Production FIRST FOLLOW
E -> TE’ { ( , id } {$,)}
F -> (E)|id { ( , id } { *, + , $ , ) }
Non
Termin
al
TAB
INPUT SYMBOLS
id + LE: * ( ) $
TABLE:
PARSING
E E -> TE’
FIRST E -> TE’
T’ T’ -> ε FOLLO
T’ -> *FT’ T’ -> ε T’ -> ε
F F -> id
W F -> (E)
CONTINUE…
Non
INPUT SYMBOLS
Termin
al
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)
Grammar Example:
:
Let’s parse the
E -> TE' input string
E'-> +TE'
| ε T -> id+idid
FT' Using the
T' -> *FT' | nonrecursive
ε LL(1) parser
F -> (E) |
id
ID + ID ID
$
E
$
stac Parsin
k g
Table
PARSING
TABLE
id + * ( ) $
E E →TE' E →TE'
F F → id F →(E )
MATCHED STACK INPUT ACTION
E$ id+id * id$
TE’$ id+id * id$ E->TE’
E'
T
+ E'
F T' T
i F T'
d
i * F T'
d
DONE…
i
d
CONTINU
E…
Non
INPUT SYMBOLS
Termin
al
TABLE: a b e i t $
PARSING TABLE S
S’
E
SYMBOL FIRST FOLLOW
S iEtSS’ | a
a,i $,e TABLE:
S’ eS |ε
e, ε $,e
FAST &
Eb
b t
FOLLOW
Non
INPUT SYMBOLS
Termin
al
TABLE: a b e i t $
PARSING TABLE S Sa
S’
E
SYMBOL FIRST FOLLOW
S iEtSS’ | a
a,i $,e TABLE:
S’ eS |ε
e, ε $,e
FAST &
Eb
b t
FOLLOW
Non
INPUT SYMBOLS
Termin
al
TABLE: a b e i t $
PARSING TABLE S Sa
SiEtSS
’
S’
E
SYMBOL FIRST FOLLOW
S iEtSS’ | a
a,i $,e TABLE:
S’ eS |ε
e, ε $,e
FAST &
Eb
b t
FOLLOW
Non
INPUT SYMBOLS
Termin
al
TABLE: a b e i t $
PARSING TABLE S Sa
SiEtSS
’
S’ S’ eS
E
SYMBOL FIRST FOLLOW
S iEtSS’ | a
a,i $,e TABLE:
S’ eS |ε
e, ε $,e
FAST &
Eb
b t
FOLLOW
Non
INPUT SYMBOLS
Termin
al
TABLE: a b e i t $
PARSING TABLE S Sa
SiEtSS
’
S’ eS
S’ S’ε
S’ε
E
SYMBOL FIRST FOLLOW
S iEtSS’ | a
a,i $,e TABLE:
S’ eS |ε
e, ε $,e FAST &
Eb
b t
FOLLOW
Non
INPUT SYMBOLS
Termin
al
TABLE: a b e i t $
PARSING TABLE S Sa
SiEtSS
’
S’ eS
S’ S’ε
S’ε
E Eb
SYMBOL FIRST FOLLOW
S iEtSS’ | a
a,i $,e TABLE:
S’ eS |ε
e, ε $,e
FAST &
Eb
b t
FOLLOW
Non
INPUT SYMBOLS
Termina
l
a b e i t $
TABLE:
SiEtSS
PARSING TABLE S Sa
’
S’ eS
S’ S’ε
S’ε
AMBIGUITY
E Eb
CONTINU
E…
The grammar is ambiguous and it is evident by the fact
that
we have two entries corresponding to M[S’,e]
containing S’ ε and S’ eS.
Note that the ambiguity will be solved if we use
LL(2) parser, i.e.
Always see for the two input symbols.
LL(1) grammars have distinct properties.
- No ambiguous grammar or left recursive
grammar can be LL(1).
Thus , the given grammar is not LL(1).