LL

Syntax Analysis(LL)

Ahmad Yoosofan

Compiler course

University of Kashan

https://yoosofan.github.io/course/compiler.html

Reduce Function Calls

  1. A → a B
  2. B → b A
  3. B → a
  • a a
  1. A
  2. ⇒ a B
  3. ⇒ a a
  • a a $
  1. A $
  2. ⇒ a B $
  3. ⇒ a a $
  • a b a a $
  1. A $ ⇒ a B $
  2. ⇒ a B $ ⇒ a b A $
  3. ⇒ a b a B $ ⇒ a b a a $
  • a a $
  1. A $ [ a a $]
  2. ⇒ a B $ [a a $]
  3. ⇒ B $ [a $]
  4. ⇒ B $ [a $]
  5. ⇒ a $ [a $]
  6. ⇒ $ [ $]
  • a b a a $
  1. A $ [abaa$]
  2. a B $, [abaa$]
  3. B $, [baa$]
  4. b A $ , [baa$]
  5. A $, [aa$]
  6. a B $, [aa$]
  7. B $, [a$]
  8. a $, [a$]
  9. $, [$]

First sets

  1. A → a B
  2. B → b A
  3. B → a
  1. first( A ) = {a}
  2. first( B ) = {a , b}

a

b

$

A

A → a B

B

B → a

B → b A

a

b

$

A

a B

B

a

b A

a

b

$

A

1

B

3

2

Parsing(I)

  1. A → a B
  2. B → b A
  3. B → a
  • first( A ) = {a}
  • first( B ) = {a , b}

a

b

$

A

a B

B

a

b A

  • a a $
  1. A $
  2. ⇒ a B $
  3. ⇒ a a $
  1. .a a $ [ A $ ]
  2. .a a $ [ a B $ ]
  3. .a $ [ B $ ]
  4. .a $ [ a $ ]
  5. .$ [ $ ]
  6. accept

Parsing(II)

  1. A → a B
  2. B → b A
  3. B → a
  • first( A ) = {a}
  • first( B ) = {a , b}

a

b

$

A

a B

B

a

b A

  • a b a a $
  1. A $
  2. ⇒ a B $
  3. ⇒ a B $
  4. ⇒ a b A $
  5. ⇒ a b a B $
  6. ⇒ a b a a $
  1. .a b a a $ [ A $ ]
  2. .a b a a $ [ a B $ ]
  3. .b a a $ [ B $ ]
  4. .b a a $ [ b A $ ]
  5. .a a $ [ A $ ]
  6. .a a $ [ a B $ ]
  7. .a $ [ B $ ]
  8. .a $ [ a $ ]
  9. .$ [ $ ]
  10. accept

Parsing(III)

  1. A → a B
  2. B → b A
  3. B → a
  • first( A ) = {a}
  • first( B ) = {a , b}

a

b

$

A

a B

B

a

b A

  1. A $
  2. ⇒ a B $
  3. ⇒ a b A $
  4. ⇒ a b a B $
  5. ⇒ a b a a $

Stack

input

action

$ A

a b a a $

A → a B

$ B a

a b a a $

Remove a

$ B

b a a $

B → b A

$ A b

b a a $

Remove b

$ A

a a $

A → a B

$ B a

a a $

Remove a

$ B

a $

B → a

$ a

a $

Remove a

$

$

accept

Parsing(IV)

a

b

$

A

a B

B

a

b A

Stack

input

action

A $

b $

Reject

Stack

input

action

A $

a b a b $

A → a B

a B $

a b a b $

Remove a

B $

b a b $

B → b A

b A$

b a b $

Remove b

A$

a b $

A → a B

a B$

a b $

Remove a

B$

b $

B → b A

bA$

b $

Remove b

A$

$

Reject

Stack

input

action

A $

a b b b $

A → a B

a B $

a b b b $

Remove a

B $

b b b $

B → b A

b A$

b b b $

Remove b

A$

b b $

Reject

Parsing(V)

  1. A → a B
  2. B → b A
  3. B → λ

first

  • first( A ) = {a}
  • first( B ) = {b , λ}

a

b

$

A

a B

B

b A

Stack

input

action

A $

a b a $

A → a B

a B $

a b a $

Remove a

B $

b a $

B → b A

b A $

b a $

Remove b

A $

a $

A → a B

a B $

a $

Remove a

B $

$

B → λ

$

$

accept

a

b

$

A

a B

B

b A

λ

Parsing(VI)

  1. A → a B
  2. B → b A
  3. B → λ
  • first( A ) = {a}
  • first( B ) = {b , λ}

a

b

$

A

a B

B

λ

b A

λ

Stack

input

action

A $

a a $

A → a B

a B $

a a $

Remove a

B $

a $

B → λ

$

a $

Reject

a

b

$

A

a B

B

b A

λ

Stack

input

action

A $

a a $

A → a B

a B $

a a $

Remove a

B $

a $

Reject

Parsing(VII)

  1. A → a B
  2. B → b A
  3. B → λ
  • first( A ) = {a}
  • first( B ) = {b , λ}
  1. follow( A ) = {$}
  2. follow( B ) = {$}

a

b

$

A

a B

B

b A

λ

Stack

input

action

A $

a a $

A → a B

a B $

a a $

Remove a

B $

a $

Reject

Wrong Calculator Grammar(I)

  1. E → T + E | T
  2. T → F * T | F
  3. F → ( E ) | a

Some text books use id instead of a

Remove Left Factor

  1. E → T E'
  2. E' → + E' | λ
  3. T → F T'
  4. T' → * T' | λ
  5. F → ( E ) | a
  1. first(E)
  2. = first(T)=first(F)
  3. = { a, ( }
  4. first(E') = { + , λ}
  5. first(T') = { * , λ}

a

+

*

(

)

$

E

T E'

T E'

E'

+ E

T

F T'

F T'

T'

* T

F

a

( E )

Adding λ to table

  1. E → T + E | T
  2. T → F * T | F
  3. F → ( E ) | a

Remove Left Factor

  1. E → T E'
  2. E' → + E | λ
  3. T → F T'
  4. T' → * T | λ
  5. F → ( E ) | a
  1. first(E)
  2. = first(T)=first(F)
  3. = { a, ( }
  4. first(E') = { + , λ}
  5. first(T') = { * , λ}
  6. first(F) = { a , ( }

a

+

*

(

)

$

E

T E'

T E'

E'

λ

+ E

λ

λ

λ

λ

T

F T'

F T'

T'

λ

λ

* T

λ

λ

λ

F

a

( E )

Wrong Calculator Grammar(II)

  1. E → T E'
  2. E' → + E
  3. E' → λ
  4. T → F T'
  5. T' → * T
  6. T' → λ
  7. F → ( E )
  8. F → a
  • first(E) = first(T) = first(F) = { a, ( }
  • first(E') = { + , λ }
  • first(T') = { * , λ }
  • follow(E) = { $ , ) }
  • follow(E') = { $ , ) }
  • follow(T) = { + , $ , ) }
  • follow(T') = { + , $ , ) }
  • follow(F) = { * , + , $ , ) }

a

+

*

(

)

$

E

T E'

T E'

E'

+ E

λ

λ

T

F T'

F T'

T'

λ

* T

λ

λ

F

a

( E )

Stack

input

action

E $

a + a * a $

E → T E'

T E' $

a + a * a $

T → F T'

F T' E' $

a + a * a $

F → a

a T' E' $

a + a * a $

Remove a

T' E' $

+ a * a $

T' → λ

E' $

+ a * a $

E' → + E

+ E $

+ a * a $

Remove +

E $

a * a $

E → T E'

T E' $

a * a $

T → F T'

F T' E' $

a * a $

F → a

a T' E' $

a * a $

Remove a

T' E' $

* a $

T' → * T

* T E' $

* a $

Remove *

T E' $

a $

T → F T'

F T' E' $

a $

F → a

a T' E' $

a $

Remove a

T' E' $

$

T' → λ

E' $

$

E' → λ

$

$

accept

First set

  1. If X → λ is a production rule then λ ∈ first(X)
  2. If X → Y_1 Y_2 .... Y_n is a production rule then
    1. first(Y_1) ⊂ first(X)
    2. first(Y_2) ⊂ first(X) if λ ∈ first(Y_1) or Y_1 ⇒^* λ
    3. first(Y_3) ⊂ first(X) if λ ∈ first(Y_1) and λ ∈ first(Y_2)
    4. first(Y_i) ⊂ first(X) if λ ∈ first(Y_j) for j = 1, 2, 3, i-1
    5. λ ∈ first(X) if λ ∈ first(Y_i) for i = 1, 2, 3, n or X ⇒^* λ

Follow set

  1. If S is start symbol then $ ∈ follow(S)
  2. If X → α Y then follow(X) ⊂ follow(Y)
  3. If X → Y_1 Y_2 Y_3 Y_4 ..... Y_n is a production rule then
    1. (first(Y_3) - {λ} ) ⊂ follow(Y_2)
      • if M → α A a β is a production rule then a ∈ follow(A)
    2. If λ ∈ first(Y_3) then (first(Y_4) - {λ} ) ⊂ follow(Y_2)
      • or (first(Y_3) ∪ first(Y_4) - {λ} ) ⊂ follow(Y_2)
    3. If λ ∈ first(Y_j) for j = 3,4, ....., i-1 then (first(Y_i) - {λ} ) ⊂ follow(Y_2)
    4. If λ ∈ first(Y_j) for j = 3,4, ....., n then follow(X) ⊂ follow(Y_2)

Wrong Calculator Grammar(I)

  1. E → T + E | T
  2. T → F * T | F
  3. F → ( E ) | a

Remove Left Factor

  1. E → T E'
  2. E' → + E | λ
  3. T → F T'
  4. T' → * T | λ
  5. F → ( E ) | a
  1. first(E)
  2. = first(T)=first(F)
  3. = { a, ( }
  4. first(E') = { + , λ}
  5. first(T') = { * , λ}

Follow set(II)

  1. If [ S ] is start symbol then [ $ ∈ follow(S) ]
  2. If [ X → α Y ] then [ follow(X) ⊂ follow(Y) ]
  3. If [ X → Y_1 Y_2 Y_3 Y_4 ..... Y_n ] is a production rule then
    1. [ (first(Y_3) - {λ} ) ⊂ follow(Y_2) ]
    2. If [ λ ∈ first(Y_3) ] then [ (first(Y_4) - {λ} ) ⊂ follow(Y_2) ]
    3. If [ λ ∈ first(Y_j) for j = 3,4, ....., i-1 ] then [ (first(Y_i) - {λ} ) ⊂ follow(Y_2) ]
    4. If [ λ ∈ first(Y_j) for j = 3,4, ....., n ] then [ follow(X) ⊂ follow(Y_2) ]

Production Rules

  1. E → T E'
  2. E' → + E
  3. E' → λ
  4. T → F T'
  5. T' → * T
  6. T' → λ
  7. F → ( E )
  8. F → a

Follow sets

  • follow(E) = { $ , ) }
  • follow(E')= { $ , ) }
  • follow(T) = { + , $, ) }
  • follow(T')= { + , $, ) }
  • follow(F) = { * , +, $, ) }

Using Follow set(I)

a

+

*

(

)

$

E

T E'

T E'

E'

+ E

T

F T'

F T'

T'

* T

F

a

( E )

a

+

*

(

)

$

E

T E'

T E'

E'

+ E

λ

λ

T

F T'

F T'

T'

λ

* T

λ

λ

F

a

( E )

Stack

input

action

E $

a + a $

E → F T'

F T' $

a + a $

F → a

a T' $

b a a $

B → b A

b A $

b a a $

Remove b

A $

a a $

A → a B

a B $

a a $

Remove a

B $

a $

B → a

a $

a $

Remove a

$

$

accept

Simple Calculator(I)

  1. E → E + T
  2. E → E - T
  3. E → T
  4. T → T * F
  5. T → T / F
  6. T → F
  7. F → a
  8. F → (E)
  1. first(E)
  2. = First(T)
  3. = first(F)
  4. = { a , ( }
  1. follow(E) = { $ , + , - , ) }
  2. follow(T) = { $ , + , - , ) , * , / }
  3. follow(F) = { $ , + , - , ) , * , / }

a

+

-

*

/

(

)

$

E

E + T | E - T | T

E + T | E - T | T

T

T * F | T / F | F

T * F | T / F | F

F

a

( E )

Simple Calculator(I)

  1. E → E + T | E - T | T
  2. T → T * F | T / F | F
  3. F → a | (E)

Convert to

  1. E → T E'
  2. E' → + T E' | - T E' | λ
  3. T → F T'
  4. T' → * F T' | / F T' | λ
  5. F → a | (E)
  1. First(E)
    1. = First( T E' )
    2. = First(T)
    3. = First(FT')
    4. = First(F)
    5. = {a, ( }
  2. First(E')
    1. = First(+ T E')
    2. First(- T E')
    3. First( λ )
    4. = {+, -, λ}
  3. First(T')
    1. = First(* F T')
    2. First(/ F T')
    3. First(λ)
    4. = {*, /, λ}

From First Sets to a Table

  1. E → T E'
  2. E' → + T E' | - T E' | λ
  3. T → F T'
  4. T' → * F T' | / F T' | λ
  5. F → a | (E)
  6. First(E) = First(T) = First(F) = {a, ( }
  7. First(E') = {+, -, λ}
  8. First(T') = {*, /, λ}

a

+

-

*

/

(

)

$

E

T E'

T E'

E'

+ T E'

- T E'

T

F T'

F T'

T'

* F T'

/ F T'

F

a

( E )

Parsing(I)

  1. First(E) = First(T) = First(F) = {a, ( }
  2. First(E') = {+, -, λ}
  3. First(T') = {*, /, λ}

a

+

-

*

/

(

)

$

E

T E'

T E'

E'

+ T E'

- T E'

T

F T'

F T'

T'

* F T'

/ F T'

F

a

( E )

  1. a $ { 435.43 }
  2. .a $ [ T E' ]
  3. .a $ [ F T' E' ]
  4. .a $ [ a T' E' ]
  5. .$ [ T' E' ]
  6. ? ? ?

Parsing(II)

  1. First(E) = First(T) = First(F) = {a, ( }
  2. First(E') = {+, -, λ}
  3. First(T') = {*, /, λ}

a

+

-

*

/

(

)

$

E

T E'

T E'

E'

+ T E'

- T E'

T

F T'

F T'

T'

* F T'

/ F T'

λ

F

a

( E )

  1. a $ { 435.43 }
  2. .a $ [ T E' ]
  3. .a $ [ F T' E' ]
  4. .a $ [ a T' E' ]
  5. .$ [ T' E' ]
  6. .$ [ λ E' ]
  7. .$ [ E' ]
  8. ? ? ?

Parsing(III)

  1. First(E) = First(T) = First(F) = {a, ( }
  2. First(E') = {+, -, λ}
  3. First(T') = {*, /, λ}

a

+

-

*

/

(

)

$

E

T E'

T E'

E'

+ T E'

- T E'

λ

T

F T'

F T'

T'

* F T'

/ F T'

λ

F

a

( E )

  1. a $ { 435.43 }
  2. .a $ [ T E' ]
  3. .a $ [ F T' E' ]
  4. .a $ [ a T' E' ]
  5. .$ [ T' E' ]
  6. .$ [ λ E' ]
  7. .$ [ E' ]
  8. .$ [ λ ]
  9. .$ [ ]
  10. accept

Use LL Table for Parsing

  1. First(E) = First(T) = First(F) = {a, ( }
  2. First(E') = {+, -, λ}
  3. First(T') = {*, /, λ}

a

+

-

*

/

(

)

$

E

T E'

T E'

E'

+ T E'

- T E'

T

F T'

F T'

T'

* F T'

/ F T'

F

a

( E )

  1. a + a * a $ [435.43 + 376.1 * 94.2]
  2. .a + a * a $ [ T E' ]
  3. .a + a * a $ [ F T' E' ]
  4. .a + a * a $ [ a T' E' ]
  5. .+ a * a $ [ T' E' ]
  6. .+ a * a $ [ T' E' ]

a

+

-

*

/

(

)

$

E

T E'

T E'

E'

+ T E'

- T E'

λ

λ

T

F T'

F T'

T'

λ

λ

* F T'

/ F T'

λ

λ

F

a

( E )

Stack

input

action

E $

.a - a / a $

E → T E'

T E' $

.a - a / a $

T → F T'

F T' E' $

.a - a / a $

F → a

a T' E' $

.a - a / a $

Remove a

T' E' $

. - a / a $

T' → λ

E' $

. - a / a $

E' → - T E'

- T E' $

. - a / a $

Remove -

T E' $

. a / a $

T → F T'

F T' E' $

. a / a $

F → a

a T' E' $

. a / a $

Remove a

T' E' $

. / a $

T' → / F T'

/ F T' E' $

. / a $

Remove /

F T' E' $

. a $

F → a

a T' E' $

. a $

Remove a

T' E' $

. $

T' → λ

E' $

. $

E' → λ

$

. $

accept

a

+

-

*

/

(

)

$

E

TE'

TE'

E'

+ TE'

- TE'

λ

λ

T

FT'

FT'

T'

λ

λ

* FT'

/ FT'

λ

λ

F

a

(`E)`

Stack

input

action

E $

.( a + a ) a$

E → T E'

T E' $

.( a + a ) a$

T → F T'

F T' E' $

.( a + a ) a$

F → ( E )

( E ) T' E' $

.( a + a ) a$

Remove (

E ) T' E' $

. a + a ) a$

E → T E'

T E' ) T' E' $

. a + a ) a$

T → F T'

F T' E' ) T' E'$

. a + a ) a$

F → a

a T' E' ) T' E'$

. a + a ) a$

Remove a

T' E' ) T' E' $

. + a ) a $

T' → λ

E' ) T' E' $

. + a ) a $

E' → + T E'

+ T E' ) T' E'$

. + a ) a $

Remove +

T E' ) T' E' $

. a ) a $

T → F T'

F T' E' ) T' E'$

. a ) a $

F → a

a T' E' ) T' E'$

. a ) a $

Remove a

T' E' ) T' E' $

. ) a $

T' → λ

E' ) T' E' $

. ) a $

E' → λ

) T' E' $

. ) a $

Remove )

T' E' $

. a $

T' → λ

E' $

. a $

E' → λ

$

. a $

Reject

  1. E → T E'
  2. E' → + T E'
  3. E' → - T E'
  4. E' → λ
  5. T → F T'
  6. T' → * F T'
  7. T' → / F T'
  8. T' → λ
  9. F → a
  10. F → ( E )

.

a

+

-

*

/

(

)

$

E

TE'

TE'

E'

+TE'

-TE'

λ

λ

T

FT'

FT'

T'

λ

λ

*FT'

/FT'

λ

λ

F

a

(E)

S → i(r) S | i(r) S e S | o

  • Eliminate Left Factor
  1. S → i(r) S A | o
  2. A → e S | λ
  • first(S) = {i, o} , first(A) = {e, λ}
  • follow(S) = {$, e} , follow(A) = {$, e}

i

r

e

o

(

)

$

S

i(r)SA

o

A

eS/λ

λ

End

1