13
COP4020 Programming Languages Computing LL(1) parsing table Prof. Xin Yuan

COP4020 Programming Languages

  • Upload
    pooky

  • View
    45

  • Download
    0

Embed Size (px)

DESCRIPTION

COP4020 Programming Languages. Computing LL(1) parsing table Prof. Xin Yuan. Overview. LL(1) parsing in action (Top-down parsing) Computing LL(1) parsing table. Using the parsing table, the predictive parsing program works like this: A stack of grammar symbols ($ on the bottom) - PowerPoint PPT Presentation

Citation preview

Page 1: COP4020 Programming Languages

COP4020Programming Languages

Computing LL(1) parsing table

Prof. Xin Yuan

Page 2: COP4020 Programming Languages

COP4020 Spring 2014 204/20/23

Overview

LL(1) parsing in action (Top-down parsing) Computing LL(1) parsing table

Page 3: COP4020 Programming Languages

Using the parsing table, the predictive parsing program works like this: A stack of grammar symbols ($ on the

bottom) A string of input tokens ($ at the end) A parsing table, M[NT, T] of productions Algorithm: put ‘$ Start’ on the stack ($ is the end

of input string).1) if top == input == $ then accept2) if top == input then pop top of the stack; advance to next

input symbol; goto 1;3) if top is nonterminal if M[top, input] is a production then

replace top with the production; goto 1 else error4) else error

Page 4: COP4020 Programming Languages

Example:

(1) E->TE’(2) E’->+TE’(3) E’->(4) T->FT’(5) T’->*FT’(6) T’->(7) F->(E)(8) F->id

id + * ( ) $E (1) (1)E’ (2) (3) (3)T (4) (4)T’ (6) (5) (6) (6)F (8) (7)

Stack input production$E id+id*id$ $E’T id+id*id$ E->TE’$E’T’F id+id*id$ T->FT’$E’T’id id+id*id$ F->id$E’T’ +id*id$ …...

This produces leftmost derivation:E=>TE’=>FT’E’=>idT’E’=>….=>id+id*id

Page 5: COP4020 Programming Languages

(1) E->TE’(2) E’->+TE’(3) E’->(4) T->FT’(5) T’->*FT’(6) T’->(7) F->(E)(8) F->id

id + * ( ) $E (1) (1)E’ (2) (3) (3)T (4) (4)T’ (6) (5) (6) (6)F (8) (7)

How to compute the parsing table for LL(1) grammar?Key: We need to make choice for every production

When can E be expanded with production E->TE’?

Intuitively, any token that can be the first token by expanding TE’.This should include all first token by expanding T, what are they?What if T can derive empty string ( ) , we should also include the first

token that can be derived from E’ What if E’ can also derive empty string? We should all possible tokens that can potentially follow E?

When should E’ be expanded with production E’-> ?

Page 6: COP4020 Programming Languages

(1) E->TE’(2) E’->+TE’(3) E’->(4) T->FT’(5) T’->*FT’(6) T’->(7) F->(E)(8) F->id

id + * ( ) $E (1) (1)E’ (2) (3) (3)T (4) (4)T’ (6) (5) (6) (6)F (8) (7)

How to compute the parsing table for LL(1) grammar?Intuition: We need to make choice for every production

•Case 1 (easy): E’->+TE’: expand for all tokens that can be the first token after expanding the right hand side of the production (expanding +TE’) •Case 1 (harder): E->TE’: expand for all tokens that can be the first token after expanding TE’•We call this First set.

•Case 2: E’-> : no first token? Whenever we see a token that can potential follow E’ in a sentential form. (Follow set)

Page 7: COP4020 Programming Languages

For a production that can derive a string of tokens, find all possible first tokens. A production N -> X Y Z should be expanded when the

token can be the first of X Y Z (after derivation): First(X Y Z).

For a production that can derive empty string, find all possible tokens that can follow the nonterminal. When should we expand with E’-> ?

Anything token that can potentially follow E’: Follow(E’).

Page 8: COP4020 Programming Languages

First set and follow set First( ): Here, is a string of symbols. The set of

terminals that begin strings derived from a. If a is empty string or generates empty string, then empty

string is in First( ). Follow(A): Here, A is a nonterminal symbol.

Follow(A) is the set of terminals that can immediately follow A in a sentential form.

Example: S->iEtS | iEtSeS|a

E->b

First(a) = ?, First(iEtS) = ?, First(S) = ?

Follow(E) = ? Follow(S) = ?

Page 9: COP4020 Programming Languages

Compute FIRST(X) If a is a terminal then FIRST(a) = {a} (Case 1) If X-> , add to FIRST(X). (Case 2) If and add every none in

FIRST( ) to FIRST(X). If , add to FIRST(X). (Case 3)

FIRST( ): similar to the third case.

E->TE’ FIRST(E) = ? E’->+TE’| FIRST(E’)= ?T->FT’ FIRST(T) = ?T’->*FT’ | FIRST(T’) = ?F->(E) | id FIRST(F) = ?

kYYYX ... 21 ... 121 iYYY

... 21 kYYY iY

kYYY ... 21

Page 10: COP4020 Programming Languages

Computing first set

COP4020 Spring 2014 1004/20/23

E->TE’ FIRST(E) = {(, id} E’->+TE’| FIRST(E’)={+, }T->FT’ FIRST(T) = {(, id}T’->*FT’ | FIRST(T’) = {*, }F->(E) | id FIRST(F) = {(, id}

Page 11: COP4020 Programming Languages

Compute Follow(A) If S is the start symbol, add $ to Follow(S). If A-> B , add First( )-{ } to Follow(B). If A-> B or A-> B and => , add Follow(A) to Follow(B).

Note: you are looking at the right hand side of productions!!!

E->TE’ First(E) = {(, id}, Follow(E)={), $} E’->+TE’| First(E’)={+, e}, Follow(E’) = {), $}T->FT’ First(T) = {(, id}, Follow(T) = {+, ), $}T’->*FT’ | First(T’) = {*, e}, Follow(T’) = {+, ), $}F->(E) | id First(F) = {(, id}, Follow(F) = {*, +, ), $}

Page 12: COP4020 Programming Languages

How to construct the parsing table? With first(a) and follow(A), we can build the parsing table.

For each production A-> : Add A-> to M[A, t] for each t in First( ). If First( ) contains empty string

Add A-> to M[A, t] for each t in Follow(A) if $ is in Follow(A), add A-> to M[A, $]

Make each undefined entry of M error.

Construct parsing table for the following grammar:

E->TE’ First(E) = {(, id}, Follow(E)={), $} E’->+TE’| First(E’)={+, e}, Follow(E’) = {), $}T->FT’ First(T) = {(, id}, Follow(T) = {+, ), $}T’->*FT’ | First(T’) = {*, e}, Follow(T’) = {+, ), $}F->(E) | id First(F) = {(, id}, Follow(F) = {*, +, ), $}

Page 13: COP4020 Programming Languages

LL(1) grammar: A grammar whose parsing table has no multiply-defined

entries is a LL(1) grammar. use one input symbol of lookahead at each step to make a parsing

decision. No ambiguous or left-recursive grammar can be LL(1) A grammar is LL(1) iff for each set of A productions, where The following conditions hold:

nA |...|| 21

ji andn j1 andn i1 when {},)()( ji FirstFirst

j.i when {}, Follow(A))First( (b)

ji when e, no, (a)

the, if

j

j

i n