Bottomupparser

82
l Syntactic Analysis (Bottom-up Parsing) (Bottom up Parsing) Dr. P K Singh Dr P K Singh TCS 502 Compiler Design 1

Transcript of Bottomupparser

Page 1: Bottomupparser

lSyntactic Analysis(Bottom-up Parsing)(Bottom up Parsing)

Dr. P K Singh

Dr P K Singh TCS 502 Compiler Design 1

Page 2: Bottomupparser

LR ParsersThe most powerful shift-reduce parsing (yet efficient) is:

LR(k) parsing.

left to right right-most k lookheadscanning derivation (k is omitted it is 1)

• LR parsing is attractive because:– LR parsing is most general non-backtracking shift-reduce parsing, yet it is still

efficient.

– The class of grammars that can be parsed using LR methods is a proper superset of the class of grammars that can be parsed with predictive parsers.

LL(1)-Grammars ⊂ LR(1)-Grammars

A LR d t t t ti it i ibl t d l ft– An LR-parser can detect a syntactic error as soon as it is possible to do so a left-to-right scan of the input.

Dr P K Singh TCS 502 Compiler Design 2

Page 3: Bottomupparser

LR Parsers

• LR-Parsers– covers wide range of grammarscovers wide range of grammars.– SLR – simple LR parser – LR – most general LR parserg p– LALR – intermediate LR parser (look-head LR parser)– SLR, LR and LALR work same (they used the same

l ith ) l th i i t bl diff talgorithm), only their parsing tables are different.

Dr P K Singh TCS 502 Compiler Design 3

Page 4: Bottomupparser

LR Parsing

S

a1...

ai...

an $

stackinput

Sm

Xm

Sm-1

LR Parsing Algorithm

outputm 1

Xm-1

.

Algorithm

.

S1

X1

Action Tableterminals and $

s

Goto Tablenon-terminal

s1

S0

t four different a actionstes

t each item isa a state numbertes

Dr P K Singh TCS 502 Compiler Design 4

s s

Page 5: Bottomupparser

A Configuration of LR Parsing Algorithm

• A configuration of a LR parsing is:

( S X S X S a a a $ )( So X1 S1 ... Xm Sm, ai ai+1 ... an $ )

Stack Rest of Inputp

• Sm and ai decides the parser action by consulting the parsing action table (Initial Stack contains just S )parsing action table. (Initial Stack contains just So )

• A configuration of a LR parsing represents the right sentential form:sentential form:

X1 ... Xm ai ai+1 ... an $

Dr P K Singh TCS 502 Compiler Design 5

Page 6: Bottomupparser

Actions of A LR-Parser1. shift s -- shifts the next input symbol and the state s onto the stack

( So X1 S1 ... Xm Sm, ai ai+1 ... an $ ) ( So X1 S1 ... Xm Sm ai s, ai+1 ... an $ )

2. reduce A→β (or rn where n is a production number)

– pop 2|β| (=r) items from the stack;

th h A d h t [ A]– then push A and s where s=goto[sm-r,A]

( So X1 S1 ... Xm Sm, ai ai+1 ... an $ ) ( So X1 S1 ... Xm-r Sm-r A s, ai ... an $ )

– Output is the reducing production reduce A→β

3. Accept – Parsing successfully completed3. Accept Parsing successfully completed

4. Error -- Parser detected an error (an empty entry in the action table)

Dr P K Singh TCS 502 Compiler Design 6

Page 7: Bottomupparser

Reduce Action• pop 2|β| (=r) items from the stack; let us assume that

β = Y1Y2...Yr

th h A d h t [ A]• then push A and s where s=goto[sm-r,A]

( So X1 S1 ... Xm r Sm r Y1 Sm r ...Yr Sm, ai ai+1 ... an $ ) ( So X1 S1 ... Xm-r Sm-r Y1 Sm-r ...Yr Sm, ai ai+1 ... an $ )

( So X1 S1 ... Xm-r Sm-r A s, ai ... an $ )

• In fact, Y1Y2...Yr is a handle.

X1 ... Xm-r A ai ... an $ ⇒ X1 ... Xm Y1...Yr ai ai+1 ... an $

Dr P K Singh TCS 502 Compiler Design 7

Page 8: Bottomupparser

(SLR) Parsing Tables for Expression Grammar

state id + * ( ) $ E T F

0 s5 s4 1 2 3

Action Table Goto Table1) E → E+T

0 s5 s4 1 2 3

1 s6 acc

2 r2 s7 r2 r2

2) E → T3) T → T*F4) T F 3 r4 r4 r4 r4

4 s5 s4 8 2 3

5 r6 r6 r6 r6

4) T → F5) F → (E)6) F → id 6 s5 s4 9 3

7 s5 s4 10

8 s6 s11

6) F → id

9 r1 s7 r1 r1

10 r3 r3 r3 r3

11 r5 r5 r5 r5

Dr P K Singh TCS 502 Compiler Design 8

Page 9: Bottomupparser

Actions of A (S)LR-Parser -- Examplestack input action output0 id*id+id$ shift 50id5 *id+id$ reduce by F→id F→id0F3 *id+id$ reduce by T→F T→F0T2 *id+id$ shift 70T2*7 id+id$ shift 50T2*7id5 +id$ d b F id F id0T2*7id5 +id$ reduce by F→id F→id0T2*7F10 +id$ reduce by T→T*F T→T*F0T2 +id$ reduce by E→T E→T0E1 +id$ shift 60E1 +id$ shift 60E1+6 id$ shift 50E1+6id5 $ reduce by F→id F→id0E1+6F3 $ reduce by T→F T→F0E1+6T9 $ reduce by E→E+T E→E+T0E1 $ accept

Dr P K Singh TCS 502 Compiler Design 9

Page 10: Bottomupparser

Constructing SLR Parsing Tables LR(0) It

• An LR(0) item of a grammar G is a production of G a dot at the some position of the right side.

LR(0) Item

• Ex: A → aBb Possible LR(0) Items: A → .aBb

(four different possibility) A → a.Bb

A → aB.b

A → aBb.• Sets of LR(0) items will be the states of action and goto table of the SLR

parser.p

• A collection of sets of LR(0) items (the canonical LR(0) collection) is the basis for constructing SLR parsers.

A d G• Augmented Grammar:

G’ is G with a new production rule S’→S where S’ is the new starting symbol.

Dr P K Singh TCS 502 Compiler Design 10

Page 11: Bottomupparser

The Closure Operation

• If I is a set of LR(0) items for a grammar G, then closure(I) is the set of LR(0) items constructed from I by the two rules:

1. Initially, every LR(0) item in I is added to closure(I).

2 If A → α Bβ is in closure(I) and B→γ is a production rule of G; 2. If A → α.Bβ is in closure(I) and B→γ is a production rule of G; then B→.γ will be in the closure(I). We will apply this rule until no more new LR(0) items can be dd d t l (I)added to closure(I).

Dr P K Singh TCS 502 Compiler Design 11

Page 12: Bottomupparser

The Closure Operation -- Example

E’ → E closure({E’ → .E}) = E → E+T { E’ → .E kernel itemsE → E+T { E → .E kernel itemsE → T E → .E+TT → T*F E → .TT → F T → .T*FF → (E) T → .FF → id F → .(E)

F → .id }

Dr P K Singh TCS 502 Compiler Design 12

Page 13: Bottomupparser

Goto Operation• If I is a set of LR(0) items and X is a grammar symbol (terminal or non-

terminal), then goto(I,X) is defined as follows:

– If A → α.Xβ in I

then every item in closure({A → αX.β}) will be in goto(I,X).

Example:I ={ E’ →.E, E →.E+T, E →.T,

T →.T*F, T →.F,

F →.(E), F →.id }

goto(I,E) = { E’ → E., E → E.+T }

goto(I,T) = { E → T., T → T.*F }

goto(I,F) = {T → F. }

goto(I,() = { F → (.E), E →.E+T, E →.T, T →.T*F, T →.F,

F →.(E), F →.id }

goto(I,id) = { F → id. }

Dr P K Singh TCS 502 Compiler Design 13

Page 14: Bottomupparser

Construction of The Canonical LR(0) Collection

• To create the SLR parsing tables for a grammar G, we will create the canonical LR(0) collection of the grammar G’.

• Algorithm:• Algorithm:

C is { closure({S’→.S}) }

repeat the followings until no more set of LR(0) items can be added to C.

for each I in C and each grammar symbol X

if goto(I,X) is not empty and not in C

add goto(I,X) to Cadd goto(I,X) to C

• goto function is a DFA on the sets in C.

Dr P K Singh TCS 502 Compiler Design 14

Page 15: Bottomupparser

The Canonical LR(0) Collection -- ExampleI0: E’ → .E . I4: F → (.E) I7: T → T*.F

E → .E+T E → .E+T F → .(E) E → .T E → .T F → .id T T*F T T*F T → .T*F T → .T*F .T → .F T → .F I8: F → (E.)F → .(E) F → .(E) E → E.+TF → .id F → .id

I9: E → E+T.I1: E’ → E I5: F → id. T → T.*F

E → E.+TI : E → E+ T I : T → T*FI6: E → E+.T I10: T → T*F

I2: E → T. T → .T*F T → T.*F T → .F I11: F → (E).

F → .(E) I3: T → F. F → .id

Dr P K Singh TCS 502 Compiler Design 15

Page 16: Bottomupparser

Transition Diagram (DFA) of Goto Function

I0 I1 I6 I9 to I7FE T *+

to I3to I4to I5

id

(F

T

I2

I

I7

to I5

I10t I

*F

F

(I3

I4 I8

to I4to I5

ET

)id

(id

I5

to I2to I3to I4

I11to I6

+TF

(

idid

Dr P K Singh TCS 502 Compiler Design 16

to I4

Page 17: Bottomupparser

Constructing SLR Parsing Table (of an augumented grammar G’)

1. Construct the canonical collection of sets of LR(0) items for G’. C←{I0,...,In}

2. Create the parsing action table as follows• If a is a terminal, A→α.aβ in Ii and goto(Ii,a)=Ij then action[i,a] is shift j.• If A→α. is in Ii , then action[i,a] is reduce A→α for all a in FOLLOW(A) i , [ , ] ( )

where A≠S’.• If S’→S. is in Ii , then action[i,$] is accept.• If any conflicting actions generated by these rules, the grammar is not SLR(1).

3. Create the parsing goto table• for all non-terminals A, if goto(Ii,A)=Ij then goto[i,A]=j

4. All entries not defined by (2) and (3) are errors.

5 Initial state of the parser contains S’→ S

Dr P K Singh TCS 502 Compiler Design 17

5. Initial state of the parser contains S →.S

Page 18: Bottomupparser

Parsing Tables of Expression Grammar

state id + * ( ) $ E T F

0 5 4 1 2 3

Action Table Goto Table

0 s5 s4 1 2 3

1 s6 acc

2 r2 s7 r2 r2

3 r4 r4 r4 r4

4 s5 s4 8 2 3

5 r6 r6 r6 r65 r6 r6 r6 r6

6 s5 s4 9 3

7 s5 s4 10

8 6 118 s6 s11

9 r1 s7 r1 r1

10 r3 r3 r3 r3

Dr P K Singh TCS 502 Compiler Design 18

11 r5 r5 r5 r5

Page 19: Bottomupparser

SLR(1) Grammar

• An LR parser using SLR(1) parsing tables for a grammar G is called as the SLR(1) parser for G.

• If a grammar G has an SLR(1) parsing table, it is called SLR(1) grammar (or SLR grammar in short).

• Every SLR grammar is unambiguous, but every unambiguous grammar is not a SLR grammar.

Dr P K Singh TCS 502 Compiler Design 19

Page 20: Bottomupparser

shift/reduce and reduce/reduce conflicts

• If a state does not know whether it will make a shift operation or reduction for a terminal, we say that there is a shift/reduce conflict.

• If a state does not know whether it will make a reduction operation using the production rule i or j for a terminal, we say that there is a reduce/reduce conflict.

• If the SLR parsing table of a grammar G has a conflict, we say that that grammar is not SLR grammar.

Dr P K Singh TCS 502 Compiler Design 20

Page 21: Bottomupparser

Conflict Example (Shift-Reduce)S → L=R I0: S’ → .S I1:S’ → S. I6: S → L=.RS → R S → .L=R R → .LL→ *R S → .R I2: S → L.=R L→ .*RL → id L → .*R R → L. L → .idR → L L → .id

R → .L I3: S → R. I7: L → *R.

I4: L → *.R I8: R → L.Problem R → .L

FOLLOW(R)={=,$} L→ .*R I9: S → L=R.FOLLOW(R) { ,$} L→ . R I9: S → L R.= shift 6 L → .id

reduce by R → Lshift/reduce conflict I5: L → id.

Action[2,=] = shift 6

Action[2,=] = reduce by R → L

Dr P K Singh TCS 502 Compiler Design 21

[ S ⇒L=R ⇒*R=R] so follow(R) contains, =

Page 22: Bottomupparser

Conflict Example2 (Reduce-Reduce)S → AaAb I0: S’ → .S S → BbBa S → .AaAb A → ε S → .BbBaB → ε A → .

B → .

ProblemFOLLOW(A)={a,b}( ) { , }FOLLOW(B)={a,b}

a reduce by A → ε b reduce by A → εreduce by B → ε reduce by B → εy y

reduce/reduce conflict reduce/reduce conflict

Dr P K Singh TCS 502 Compiler Design 22

Page 23: Bottomupparser

Constructing Canonical LR(1) Parsing Tables• In SLR method, the state i makes a reduction by A→α when the current token

is a:– if the A→α. in the Ii and a is FOLLOW(A)i ( )

• In some situations, βA cannot be followed by the terminal a in a right-sentential form when βα and the state i are on the top stack This means thatsentential form when βα and the state i are on the top stack. This means that making reduction in this case is not correct.

S → AaAb S⇒AaAb⇒Aab⇒ab S⇒BbBa⇒Bba⇒baS → AaAb S⇒AaAb⇒Aab⇒ab S⇒BbBa⇒Bba⇒baS → BbBaA → ε Aab ⇒ ε ab Bba ⇒ ε baB → ε AaAb ⇒ Aa ε b BbBa ⇒ Bb ε a

Dr P K Singh TCS 502 Compiler Design 23

Page 24: Bottomupparser

LR(1) Item• To avoid some of invalid reductions, the states need to carry more information.• Extra information is put into a state by including a terminal symbol as a second

component in an item.

• A LR(1) item is:A → α.β,a where a is the look-head of the LR(1) item

(a is a terminal or end-marker.)

• Such an object is called LR(1) item.1 f t th l th f th d t– 1 refers to the length of the second component

– The lookahead has no effect in an item of the form [A → α.β,a], where β is not ∈.But an item of the form [A → α a] calls for a reduction by A → α only if the– But an item of the form [A → α.,a] calls for a reduction by A → α only if the next input symbol is a.

– The set of such a’s will be a subset of FOLLOW(A), but it could be a proper subset.

Dr P K Singh TCS 502 Compiler Design 24

subset

Page 25: Bottomupparser

LR(1) Item (cont.)

• When β ( in the LR(1) item A → α.β,a ) is not empty, the look-head does not have any affect.

• When β is empty (A → α.,a ), we do the reduction by A→α only if the next input symbol is a (not for any terminal in FOLLOW(A)).

• A state will contain A → α.,a1 where {a1,...,an} ⊆ FOLLOW(A)...

A → α.,an

Dr P K Singh TCS 502 Compiler Design 25

Page 26: Bottomupparser

Canonical Collection of Sets of LR(1) Items• The construction of the canonical collection of the sets of LR(1) items are

similar to the construction of the canonical collection of the sets of LR(0) items except that closure and goto operations work a little bit differentitems, except that closure and goto operations work a little bit different.

closure(I) is: ( where I is a set of LR(1) items)closure(I) is: ( where I is a set of LR(1) items)

– every LR(1) item in I is in closure(I)

– if A→α.Bβ,a in closure(I) and B→γ is a production rule of G; then B→.γ,b will be in the closure(I) for each terminal b in FIRST(βa) .

Dr P K Singh TCS 502 Compiler Design 26

Page 27: Bottomupparser

goto operation

• If I is a set of LR(1) items and X is a grammar symbol (terminal or non-terminal), then goto(I,X) is defined as follows:or non terminal), then goto(I,X) is defined as follows:

– If A → α.Xβ,a in I then every item in closure({A → αX.β,a}) will be in y ({ β, })goto(I,X).

Dr P K Singh TCS 502 Compiler Design 27

Page 28: Bottomupparser

Construction of The Canonical LR(1) Collection

• Algorithm:C is { closure({S’→.S,$}) }{ ({ ,$}) }repeat the followings until no more set of LR(1) items can be

added to C.for each I in C and each grammar symbol Xfor each I in C and each grammar symbol X

if goto(I,X) is not empty and not in Cadd goto(I,X) to C

• goto function is a DFA on the sets in C.

Dr P K Singh TCS 502 Compiler Design 28

Page 29: Bottomupparser

A Short Notation for The Sets of LR(1) Items

• A set of LR(1) items containing the following items

A → α.β aA → α.β,a1

...

A → α.β,anA → α.β,an

can be written as

A → α.β, a1/a2/.../an

Dr P K Singh TCS 502 Compiler Design 29

Page 30: Bottomupparser

An Example 1. S’ → S2. S → C C 3 C C

I0: closure({(S’ → • S, $)}) =(S’ → • S, $)

3. C → c C4. C → d

( , )(S → • C C, $)(C → • c C, c/d)(C → • d c/d)

I3: goto(I1, c) =(C → c • C, c/d)(C → • c C c/d)(C → • d, c/d)

I1: goto(I1, S) = (S’ → S • , $)

(C → • c C, c/d)(C → • d, c/d)

I2: goto(I1, C) =(S → C • C, $)

I4: goto(I1, d) =(C → d •, c/d)

( , )(C → • c C, $)(C → • d, $)

I5: goto(I3, C) =(S → C C •, $)

Dr. P K Singh TCS 502 Compiler Design slide30

Page 31: Bottomupparser

(S’ → S • , $S’ → • S, $

S → • C C, $C → • c C, c/d

S I1

S → C • C, $C → • c C, $C → • d $

S → C C •, $

,C → • d, c/d

C CI0I5

C

C → • d, $

C → c • C, $

cI2

I6CC → c C, $

C → • c C, $C → • d, $

C → cC •, $

c

I

I9

d

C → c • C, c/d

C → d •, $

c

dc

C

I7

IC → c C, c/dC → • c C, c/dC → • d, c/d C → c C •, c/d

c C

I3

I8

d

Dr. P K Singh TCS 502 Compiler Design slide31C → d •, c/dd

I4d

Page 32: Bottomupparser

An Example

I6: goto(I3, c) =(C C $)

: goto(I4, c) = I4(C → c • C, $)(C → • c C, $)(C → • d, $)

: goto(I4, d) = I5( )

I7: goto(I3, d) =(C → d • $)

I9: goto(I7, c) =(C → c C •, $)

(C → d •, $)

I8: goto(I4, C) =(C C /d)

: goto(I7, c) = I7

(I d) I(C → c C •, c/d) : goto(I7, d) = I8

Dr. P K Singh TCS 502 Compiler Design slide32

Page 33: Bottomupparser

Construction of LR(1) Parsing Tables1 Construct the canonical collection of sets of LR(1) items for G’ 1. Construct the canonical collection of sets of LR(1) items for G .

C←{I0,...,In}

2. Create the parsing action table as follows

• If a is a terminal, A→α.aβ,b in Ii and goto(Ii,a)=Ij then action[i,a] is shift j.

• If A→α.,a is in Ii , then action[i,a] is reduce A→α where A≠S’.

• If S’→S.,$ is in Ii , then action[i,$] is accept.

• If any conflicting actions generated by these rules, the grammar is not LR(1).

3. Create the parsing goto table• for all non-terminals A, if goto(Ii,A)=Ij then goto[i,A]=j

4. All entries not defined by (2) and (3) are errors.

5. Initial state of the parser contains S’→.S,$

Dr. P K Singh TCS 502 Compiler Design slide33

5. Initial state of the parser contains S →.S,$

Page 34: Bottomupparser

An Example

c d $ S C0 3 4 1 20 s3 s4 g1 g2 1 a2 s6 s7 g5 3 s3 s4 g8 4 r3 r35 r15 r1 6 s6 s7 g97 r38 2 28 r2 r29 r2

Dr. P K Singh TCS 502 Compiler Design slide34

Page 35: Bottomupparser

The Core of LR(1) Items

• The core of a set of LR(1) Items is the set of their first components (i.e., LR(0) items)

• The core of the set of LR(1) items• The core of the set of LR(1) items

{ (C → c • C, c/d),(C → • c C, c/d),(C → • d, c/d) }

is { C → c • C,C → • c C,C → • d }C → • d }

Dr. P K Singh TCS 502 Compiler Design slide35

Page 36: Bottomupparser

Canonical LR(1) Collection -- Example

S → AaAb I0:S’ → .S ,$ I1: S’ → S. ,$

S → BbBa S → .AaAb ,$ S

Aa IA → ε S → .BbBa ,$ I2: S → A.aAb ,$

B → ε A → . ,a

B → . ,b I3: S → B.bBa ,$

B

a

b

to I4

to I53

I4: S → Aa.Ab ,$ I6: S → AaA.b ,$ I8: S → AaAb. ,$

A → b

A a

A → . ,b

I5: S → Bb.Ba ,$ I7: S → BbB.a ,$ I9: S → BbBa. ,$B b

B → . ,a

Dr P K Singh TCS 502 Compiler Design 36

Page 37: Bottomupparser

Canonical LR(1) Collection – Example2

S’ → S1) S → L=R

I0:S’ → .S,$S → .L=R,$

I1:S’ → S.,$ I4:L → *.R,$/=R → .L,$/=

to I7

IS L

R*

2) S → R 3) L→ *R 4) L → id

S → .R,$L → .*R,$/=L → .id,$/=

I2:S → L.=R,$R → L.,$

I :S → R $

L→ .*R,$/= L → .id,$/=

I L id $/

to I6to I8

to I4

to I5

L

Rid

id

*

5) R → L R → .L,$I3:S → R.,$ I5:L → id.,$/=

I9:S → L=R.,$I :L → *R $R

I6:S → L=.R,$R → .L,$L → .*R,$L → id $

I10:R → L.,$

I11:L → *.R,$

I13:L → *R.,$

to I10

to I11

to I9

to I13

L

R

R

* I4 and I11

L → .id,$

I7:L → *R.,$/=

11 ,R → .L,$L→ .*R,$L → .id,$

to I12 to I10

to I11

to I13

id

id L

*I5 and I12

I7 and I13

Dr P K Singh TCS 502 Compiler Design 37

I8: R → L.,$/= I12:L → id.,$to I12

idI8 and I10

Page 38: Bottomupparser

LR(1) Parsing Tables – (for Example2)id * = $ S L R

0 s5 s4 1 2 31 acc2 s6 r53 r24 s5 s4 8 75 r4 r46 s12 s11 10 97 r3 r3

no shift/reduce or no reduce/reduce conflict

⇓7 r3 r38 r5 r59 r1

10 r5

⇓so, it is a LR(1) grammar

10 r511 s12 s11 10 1312 r413 r3

Dr P K Singh TCS 502 Compiler Design 38

13 r3

Page 39: Bottomupparser

LALR Parsing Tables

• LALR stands for LookAhead LR.

• LALR parsers are often used in practice because LALR parsing tables are• LALR parsers are often used in practice because LALR parsing tables are smaller than LR(1) parsing tables.

• The number of states in SLR and LALR parsing tables for a grammar G areThe number of states in SLR and LALR parsing tables for a grammar G are equal.

• But LALR parsers recognize more grammars than SLR parsers.p g g p

• yacc creates a LALR parser for the given grammar.

A t t f LALR ill b i t f LR(1) it• A state of LALR parser will be again a set of LR(1) items.

Dr P K Singh TCS 502 Compiler Design 39

Page 40: Bottomupparser

Creating LALR Parsing Tables

Canonical LR(1) Parser LALR Parser( )

shrink # of states

• This shrink process may introduce a reduce/reduce conflict in th lti LALR ( th i NOT LALR)the resulting LALR parser (so the grammar is NOT LALR)

• But, this shrink process does not produce a shift/reduce conflict.

Dr P K Singh TCS 502 Compiler Design 40

Page 41: Bottomupparser

The Core of A Set of LR(1) Items

• The core of a set of LR(1) items is the set of its first component.

Ex: S → L.=R,$ S → L.=R CoreR → L.,$ R → L.

• We will find the states (sets of LR(1) items) in a canonical LR(1) parser with same cores. Then we will merge them as a single state.

I1:L → id.,= A new state: I12: L → id.,=

L id $L → id.,$

I2:L → id.,$ have same core, merge them

• We will do this for all states of a canonical LR(1) parser to get the states of the LALRWe will do this for all states of a canonical LR(1) parser to get the states of the LALR parser.

• In fact, the number of the states of the LALR parser for a grammar will be equal to the number of states of the SLR parser for that grammar.

Dr P K Singh TCS 502 Compiler Design 41

Page 42: Bottomupparser

Creation of LALR Parsing Tables• Create the canonical LR(1) collection of the sets of LR(1) items for the given

grammar.

• For each core present; find all sets having that same core; replace those sets havingFor each core present; find all sets having that same core; replace those sets having same cores with a single set which is their union.

C={I0,...,In} C’={J1,...,Jm} where m ≤ n

C h i bl ( i d bl ) h i f h• Create the parsing tables (action and goto tables) same as the construction of the parsing tables of LR(1) parser.

Note that: If J=I1 ∪ ... ∪ Ik since I1,...,Ik have same cores

cores of goto(I1,X),...,goto(I2,X) must be same.

So, goto(J,X)=K where K is the union of all sets of items having same cores as goto(I1,X).

• If no conflict is introduced, the grammar is LALR(1) grammar. (We may only introduce reduce/reduce conflicts; we cannot introduce a shift/reduce conflict)

Dr. P K Singh TCS 502 Compiler Design slide42

Page 43: Bottomupparser

(S’ → S • , $S’ → • S, $

S → • C C, $C → • c C, c/d

S I1

S → C • C, $C → • c C, $C → • d $

S → C C •, $

,C → • d, c/d

C CI0I5

C

C → • d, $

C → c • C, $

cI2

I6CC → c C, $

C → • c C, $C → • d, $

C → cC •, $

c

I

I9

d

C → c • C, c/d

C → d •, $

c

dc

C

I7

I

d

C → c C, c/dC → • c C, c/dC → • d, c/d C → c C •, c/d

c C

I3

I8

d

Dr. P K Singh TCS 502 Compiler Design slide43C → d •, c/dd

I4d

Page 44: Bottomupparser

(S’ → S • , $S’ → • S, $

S → • C C, $C → • c C, c/d

S I1

S → C • C, $C → • c C, $C → • d $

S → C C •, $

,C → • d, c/d

C CI0I5

C

C → • d, $

C → c • C, $

cI2

I6CC → c C, $

C → • c C, $C → • d, $

c

I d

C → c • C, c/d

C → d •, $

c

dc

C

I7

I

d

C → c C, c/dC → • c C, c/dC → • d, c/d C → c C •, c/d/$

c C

I3

I89

d

Dr. P K Singh TCS 502 Compiler Design slide44C → d •, c/dd

I4d

Page 45: Bottomupparser

(S’ → S • , $S’ → • S, $

S → • C C, $C → • c C, c/d

S I1

S → C • C, $C → • c C, $C → • d $

S → C C •, $

,C → • d, c/d

C CI0I5

C

C → • d, $

C → c • C, $

cI2

I6d CC → c C, $

C → • c C, $C → • d, $

c

I d

C → c • C, c/d

C → d •, c/d/$

c

dc

C

I47

I

d

dC → c C, c/dC → • c C, c/dC → • d, c/d C → c C •, c/d/$

c C

I3

I89

Dr. P K Singh TCS 502 Compiler Design slide45

Page 46: Bottomupparser

(S’ → S • , $S’ → • S, $

S → • C C, $C → • c C, c/d

S I1

S → C • C, $C → • c C, $C → • d $

S → C C •, $

,C → • d, c/d

C CI0I5

C

C → • d, $

C → c • C, c/d/$

cI2

I36C

C → • c C,c/d/$C → • d,c/d/$c

I dc

C → d •, c/d/$

d

dI47

I

d

C → c C •, c/d/$

d I89

Dr. P K Singh TCS 502 Compiler Design slide46

Page 47: Bottomupparser

LALR Parse Table

c d $ S Cc d $ S C0 s36 s47 1 2 1 acc2 s36 s47 5 36 s36 s47 89 47 r3 r3 r347 r3 r3 r35 r1 89 r2 r2 r2

Dr. P K Singh TCS 502 Compiler Design slide47

Page 48: Bottomupparser

Creation of LALR Parsing Tables• Create the canonical LR(1) collection of the sets of LR(1) items for the

given grammar.

• Find each core; find all sets having that same core; replace those sets d eac co e; d a sets a g t at sa e co e; ep ace t ose setshaving same cores with a single set which is their union.

C={I0,...,In} C’={J1,...,Jm} where m ≤ n

• Create the parsing tables (action and goto tables) same as the construction of the parsing tables of LR(1) parser.

– Note that: If J=I1 ∪ ... ∪ Ik since I1,...,Ik have same cores

cores of goto(I1,X),...,goto(I2,X) must be same.

– So, goto(J,X)=K where K is the union of all sets of items having same cores as goto(I1,X).

• If no conflict is introduced, the grammar is LALR(1) grammar. (We may only introduce reduce/reduce conflicts; we cannot introduce a shift/reduce conflict)

Dr P K Singh TCS 502 Compiler Design 48

conflict)

Page 49: Bottomupparser

Shift/Reduce Conflictf / f• We say that we cannot introduce a shift/reduce conflict during the

shrink process for the creation of the states of a LALR parser.

• Assume that we can introduce a shift/reduce conflict In this case• Assume that we can introduce a shift/reduce conflict. In this case, a state of LALR parser must have:

A → α.,a and B → β.aγ,bA → α.,a and B → β.aγ,b

• This means that a state of the canonical LR(1) parser must have:

A → α a and B → β aγ cA → α.,a and B → β.aγ,c

But, this state has also a shift/reduce conflict. i.e. The original canonical LR(1) parser has a conflict. ( ) p

(Reason for this, the shift operation does not depend on lookaheads)

Dr P K Singh TCS 502 Compiler Design 49

Page 50: Bottomupparser

Reduce/Reduce Conflict

• But, we may introduce a reduce/reduce conflict during the shrink process for the creation of the states of a pLALR parser.

I1 : A → α.,a I2: A → α.,b

B → β.,b B → β.,c

⇓⇓I12: A → α.,a/b reduce/reduce

conflict

B → β.,b/c

Dr P K Singh TCS 502 Compiler Design 50

Page 51: Bottomupparser

Parser Construction with YACC

YaccYaccS ifi ti y tab cCompilerSpecificationSpec.y

y.tab.c

CCompilery.tab.c a.out

a.outInput outputpuprograms

Dr P K Singh TCS 502 Compiler Design 51

Page 52: Bottomupparser

Working with Lex

Yaccparse yy.tab.c(yyparse)

Compilerparse.y (yyparse)

C compilery.tab.h (with –d)

a.out

Lexscan.l lex.yy.c(yylex)

a.outsource outputa.outprogram

Dr P K Singh TCS 502 Compiler Design 52

Page 53: Bottomupparser

Working with Lex

YaccCompiler

parse.yy.tab.c(yyparse)

C t

l

C compiler

a.outIncluded

Lexscan.l lex.yy.c

a.outsourceprogram

output

Dr P K Singh TCS 502 Compiler Design 53

Page 54: Bottomupparser

Yacc format Overall structure

Declarations

A yacc program consists of three parts:

%% <- Part separator

translation rules

%%%%

User functions

Dr P K Singh TCS 502 Compiler Design 54

Page 55: Bottomupparser

Declarations

• As with Lex, you can include C statements in the declarations section (for example #include ( pstatements, and declarations of temporary variables that will be used in the user-routines). These should be surrounded by %{ and %}be surrounded by %{ and %}.

• But more importantly, you can declare the grammar tokens, for example:, p

%token DIGIT

%token OPERATOR%token OPERATOR

etc..

Dr P K Singh TCS 502 Compiler Design 55

Page 56: Bottomupparser

Translation rules• Translation rules have the format

Grammar Production Rule1 {semantic action1}

G P d i R l 2 { i i 2}Grammar Production Rule2 {semantic action2}

• For example for the grammar rule E > Digit OP Digit• For example, for the grammar rule E -> Digit OP Digit

E : DIGIT OP DIGIT { printf(“Expression!\n”); }

• The semantic value associated with a token is denoted by $X The semantic value associated with a token is denoted by $X, where X is the position of the token in the Expression

For example, $1 is the first digit’s value, and $3 is the third’s

$$ is the resulting value for the non-terminal on the left of the

expression

Dr P K Singh TCS 502 Compiler Design 56

Page 57: Bottomupparser

User Functions

The third part can be used to provide auxiliary userfunctions that the translation rules use; these will befunctions that the translation rules use; these will besimply copied along to the generated code

%%%%void CreateARMHeader(void){

printf(“For example, I can write to a file an ARMprogram header \n”);

}}

Dr P K Singh TCS 502 Compiler Design 57

Page 58: Bottomupparser

Yacc examplesll l l l f l

The grammar we need:

We will construct a simple calculator for evaluating arithmetic expressions

E -> E + T | TT -> T * F | FF -> (E) | digit

%token DIGIT%token DIGIT%%Line : Expr ‘\n’ {printf(“%d\n”,$1); return(1);};Expr : Expr ‘+’ Term {$$ = $1 + $3;}Expr : Expr + Term {$$ = $1 + $3;}| Term;Term : Term ‘*’ Factor {$$ = $1 * $3}| Factor| Factor;Factor : ‘(‘ expr ‘)’ {$$ = $2;}: DIGIT;

Dr P K Singh TCS 502 Compiler Design 58

;

Page 59: Bottomupparser

Yacc examples%{%{#include <ctype.h>%}%token DIGIT%%Line : Expr ‘\n’ {printf(“%d\n”,$1); return(1);}Line : Expr \n {printf( %d\n ,$1); return(1);}

;Expr : Expr ‘+’ Term {$$ = $1 + $3;}

| Term;

Term : Term ‘*’ Factor {$$ = $1 * $3}| Factor;

Factor : ‘(‘ expr ‘)’ {$$ = $2;}: DIGIT;

%%%%yylex() {

int c; c= getchar();if(isdigit(c)){

yylval=c-’0’;yy ;return DIGIT;

}return c;

}

Dr P K Singh TCS 502 Compiler Design 59

Page 60: Bottomupparser

Yacc examples( ambiguous Grammar )%{%{#include <ctype.h>#include <stdio.h>#define YYSTYPE double%}%token NUM%token NUM%left ‘+’ ‘-’%left ‘*’ ‘/’%%line : line Expr ‘\n’ {printf(“\n\t Answer = %g\n”,$2); }

| line ‘\n’ |;

Expr : Expr ‘+’ Expr {$$ = $1 + $3;}| Expr ‘-’ Expr {$$ = $1 - $3;}| Expr ‘/’ Expr {$$ = $1 / $3;}| Expr ‘*’ Expr {$$ = $1 * $3;}| Expr * Expr {$$ = $1 * $3;}|‘(‘ expr ‘)’ {$$ = $2;}|NUM;

%%yylex() {yy () {

int c; while((c= getchar()==‘ ‘);if((c==‘.’||(isdigit(c))){

ungetc(c,stdin);scanf(“%lf”,&yylval);

Dr P K Singh TCS 502 Compiler Design 60

return NUM;}return c;

}

Page 61: Bottomupparser

yylex() (Through Lex) calc.l

NUM [0-9]+\.?| [0-9]*\.[0-9]+%%[ ]{NUM} {sscanf(yytext,”%lf”, &yylval);

return NUM;}return NUM;}\n|. {return yytext[0];}

Dr P K Singh TCS 502 Compiler Design 61

Page 62: Bottomupparser

Yacc examples( with Lex)%{%{#include <ctype.h>#include <stdio.h>#define YYSTYPE double%}%}%token NUM%left ‘+’ ‘-’%left ‘*’ ‘/’%%%%line : line Expr ‘\n’ {printf(“\n\t Answer = %g\n”,$2); }

| line ‘\n’ |;

Expr : Expr ‘+’ Expr {$$ = $1 + $3;}| Expr ‘-’ Expr {$$ = $1 - $3;}| Expr ‘/’ Expr {$$ = $1 / $3;}| Expr ‘*’ Expr {$$ $1 * $3;}| Expr ‘*’ Expr {$$ = $1 * $3;}|‘(‘ expr ‘)’ {$$ = $2;}|NUM;

%%

Dr P K Singh TCS 502 Compiler Design 62

%%#include “lex.yy.c”

Page 63: Bottomupparser

Canonical LALR(1) Collection – Example2

S’ → S1) S → L=R

I0:S’ → .S,$S → .L=R,$

I1:S’ → S.,$ I411:L → *.R,$/=R → .L,$/=

to I713

IS L

R*

2) S → R 3) L→ *R 4) L → id

S → .R,$L → .*R,$/=L → .id,$/=

I2:S → L.=R,$R → L.,$

I :S → R $

L→ .*R,$/= L → .id,$/=

I L id $/

to I6to I810

to I411

to I512

L

Rid

id

*

5) R → L R → .L,$I3:S → R.,$ I512:L → id.,$/=

I :S → L=R $RI6:S → L=.R,$

R → .L,$L → .*R,$L → .id $

I9:S → L=R.,$

to I810

to I411

to I9L

R

*

Same CoresI4 and I11

I and IL → .id,$

I713:L → *R.,$/=

to I512id I5 and I12

I7 and I13

I d I

Dr P K Singh TCS 502 Compiler Design 63

I810: R → L.,$/= I8 and I10

Page 64: Bottomupparser

LALR(1) Parsing Tables – (for Example2)id * = $ S L R

0 s5 s4 1 2 31 acc2 s6 r53 r24 s5 s4 8 75 r4 r46 s12 s11 10 97 r3 r3

no shift/reduce or no reduce/reduce conflict

⇓7 r3 r38 r5 r59 r1

⇓so, it is a LALR(1) grammar

Dr P K Singh TCS 502 Compiler Design 64

Page 65: Bottomupparser

Using Ambiguous Grammars

• All grammars used in the construction of LR-parsing tables must be un-ambiguous.

• Can we create LR-parsing tables for ambiguous grammars ?– Yes, but they will have conflicts., y– We can resolve these conflicts in favor of one of them to disambiguate

the grammar.– At the end, we will have again an unambiguous grammar.

h b• Why we want to use an ambiguous grammar?– Some of the ambiguous grammars are much natural, and a

corresponding unambiguous grammar can be very complex.Usage of an ambiguous grammar may eliminate unnecessary – Usage of an ambiguous grammar may eliminate unnecessary reductions.

• Ex.E → E+T | T

Dr P K Singh TCS 502 Compiler Design 65

E → E+T | T

E → E+E | E*E | (E) | id T → T*F | FF → (E) | id

Page 66: Bottomupparser

Sets of LR(0) Items for Ambiguous Grammar

I0: E’ → .EE → .E+E E → E*E

I1: E’ → E.E → E .+E E → E *E

I4: E → E +.EE → .E+E E → E*E

I7: E → E+E.E → E.+E E → E *E

I5

EE ++*(

I

I4

E → .E*EE → .(E)E → .id

E → E .*E E → .E*EE → .(E)E → .id

E → E.*E*

((

idI2

I3

I2: E → (.E)E → .E+E

I5: E → E *.EE → .E+E E → .E*EE → (E)

I8: E → E*E.E → E.+E E → E.*E

E +*

(

(

id I2I3

I4

I5

E → .E*EE → .(E)E → .id

E → .(E)E → .id

I6: E → (E.) I9: E → (E).)

E

idid

I3

I3: E → id.I6: E → (E.)

E → E.+EE → E.*E

I9: E → (E).+* I4

I5

Dr P K Singh TCS 502 Compiler Design 66

Page 67: Bottomupparser

SLR-Parsing Tables for Ambiguous Grammar

FOLLOW(E) = { $,+,*,) }

State I7 has shift/reduce conflicts for symbols + and *State I7 has shift/reduce conflicts for symbols + and .

I0 I1 I7I4E+E

when current token is +shift + is right-associativereduce + is left-associative

when current token is *when current token is *shift * has higher precedence than +reduce + has higher precedence than *

Dr P K Singh TCS 502 Compiler Design 67

Page 68: Bottomupparser

SLR-Parsing Tables for Ambiguous Grammar

FOLLOW(E) = { $,+,*,) }

State I8 has shift/reduce conflicts for symbols + and *State I8 has shift/reduce conflicts for symbols + and .

I0 I1 I7I5E*E

when current token is *shift * is right-associativereduce * is left-associative

when current token is +when current token is +shift + has higher precedence than *reduce * has higher precedence than +

Dr P K Singh TCS 502 Compiler Design 68

Page 69: Bottomupparser

SLR-Parsing Tables for Ambiguous Grammar

id + * ( ) $ E

Action Goto

0 s3 s2 11 s4 s5 acc2 s3 s2 63 r4 r4 r4 r44 s3 s2 74 s3 s2 75 s3 s2 86 s4 s5 s96 s4 s5 s97 r1 s5 r1 r18 r2 r2 r2 r2

Dr P K Singh TCS 502 Compiler Design 69

8 r2 r2 r2 r29 r3 r3 r3 r3

Page 70: Bottomupparser

Error Recovery in LR Parsing

• An LR parser will detect an error when it consults the parsing action table and finds an error entry. All empty p g y p yentries in the action table are error entries.

• Errors are never detected by consulting the goto table.• An LR parser will announce error as soon as there is no

valid continuation for the scanned portion of the input.• A canonical LR parser (LR(1) parser) will never make • A canonical LR parser (LR(1) parser) will never make

even a single reduction before announcing an error. • The SLR and LALR parsers may make several reductions

before announcing an error.• But, all LR parsers (LR(1), LALR and SLR parsers) will

never shift an erroneous input symbol onto the stack

Dr P K Singh TCS 502 Compiler Design 70

never shift an erroneous input symbol onto the stack.

Page 71: Bottomupparser

Panic Mode Error Recovery in LR Parsing

• Scan down the stack until a state s with a goto on a particular nonterminal A is found. (Get rid of everything p ( y gfrom the stack before this state s).

• Discard zero or more input symbols until a symbol a is found that can legitimately follow Afound that can legitimately follow A.– The symbol a is simply in FOLLOW(A), but this may not work for all

situations.

h k h l d h• The parser stacks the nonterminal A and the state goto[s,A], and it resumes the normal parsing.

• This nonterminal A is normally is a basic programming • This nonterminal A is normally is a basic programming block (there can be more than one choice for A).– stmt, expr, block, ...

Dr P K Singh TCS 502 Compiler Design 71

Page 72: Bottomupparser

Phrase-Level Error Recovery in LR Parsingg

• Each empty entry in the action table is marked with a specific error routine.p

• An error routine reflects the error that the user most likely will make in that case.

• An error routine inserts the symbols into the stack or the input (or it deletes the symbols from the stack and the input, or it can do both insertion and deletion).p , )– missing operand– unbalanced right parenthesis

Dr P K Singh TCS 502 Compiler Design 72

Page 73: Bottomupparser

Creating an LALR(1) Parser with Yacc/Bison

Yacc or Bisonyaccspecification y tab c

compilerspecificationyacc.y

y.tab.c

y.tab.c Ccompiler

a.out

inputstream a.out

outputstream

73

stream stream

Page 74: Bottomupparser

Yacc Specification

• A yacc specification consists of three parts:yacc declarations, and C declarations within %{ %}%%translation rules%%user-defined auxiliary procedures

• The translation rules are productions with actions:production1 { semantic action1 }p 1 { 1 }production2 { semantic action2 }…productionn { semantic actionn }p oduct o n { se a t c act o n }

74

Page 75: Bottomupparser

Writing a Grammar in Yacc

• Productions in Yacc are of the formNonterminal : tokens/nonterminals { / {

action }| tokens/nonterminals { action }…;

• Tokens that are single characters can be used Tokens that are single characters can be used directly within productions, e.g. ‘+’

• Named tokens must be declared first in the declaration part using

%token TokenName

75

Page 76: Bottomupparser

Synthesized Attributes

• Semantic actions may refer to values of the synthesized attributes of terminals and synthesized attributes of terminals and nonterminals in a production:

X : Y1 Y2 Y3 … Yn { action }$$ f t th l f th tt ib t f X– $$ refers to the value of the attribute of X

– $i refers to the value of the attribute of Yi

• For example• For examplefactor : ‘(’ expr ‘)’ { $$=$2; }

factor.val=x$$ $

76expr.val=x )(

$$=$2

Page 77: Bottomupparser

Example 1%{ #include <ctype.h> %}%token DIGIT%%line : expr ‘\n’ { printf(“%d\n” $1); }

Also results in definition of#define DIGIT xxx

line : expr ‘\n’ { printf( %d\n , $1); };

expr : expr ‘+’ term { $$ = $1 + $3; }| term { $$ = $1; };;

term : term ‘*’ factor { $$ = $1 * $3; }| factor { $$ = $1; };

factor : ‘(’ expr ‘)’ { $$ = $2; }factor : ( expr ) { $$ = $2; }| DIGIT { $$ = $1; };

%%int yylex() Att ib t f t k

Attribute ofterm (parent)

Attribute of factor (child)

int yylex(){ int c = getchar();if (isdigit(c)){ yylval = c-’0’;

return DIGIT;

Attribute of token(stored in yylval)

term (parent)

Example of a very crude lexicall i k d b th

77

return DIGIT;}return c;

}

analyzer invoked by the parser

Page 78: Bottomupparser

Dealing With Ambiguous Grammars

• By defining operator precedence levels and left/right associativity of the operators we can left/right associativity of the operators, we can specify ambiguous grammars in Yacc, such asE → E+E | E-E | E*E | E/E | (E) | -E | num| | | / | ( ) | |

• To define precedence levels and associativity in Yacc’s declaration part:

%left ‘+’ ‘-’%left ‘*’ ‘/’% i ht UMINUS%right UMINUS

78

Page 79: Bottomupparser

Example 2%{#include <ctype.h>#include <stdio.h>#define YYSTYPE double

Double type for attributesand yylval

#define YYSTYPE double%}%token NUMBER%left ‘+’ ‘-’%left ‘*’ ‘/’%left * /%right UMINUS%%lines : lines expr ‘\n’ { printf(“%g\n”, $2); }

| lines ‘\n’| lines \n| /* empty */;

expr : expr ‘+’ expr { $$ = $1 + $3; }| expr ‘-’ expr { $$ = $1 - $3; }| expr - expr { $$ = $1 - $3; }| expr ‘*’ expr { $$ = $1 * $3; }| expr ‘/’ expr { $$ = $1 / $3; }| ‘(’ expr ‘)’ { $$ = $2; }| ‘-’ expr %prec UMINUS { $$ = -$2; }

79

| - expr %prec UMINUS { $$ = -$2; }| NUMBER;

%%

Page 80: Bottomupparser

Example 2 (cont’d)

%%int yylex(){ int c;while ((c = getchar()) == ‘ ‘)

;if ((c == ‘.’) || isdigit(c)) Crude lexical analyzer for

f d bl d i h i{ ungetc(c, stdin);scanf(“%lf”, &yylval);return NUMBER;

}

fp doubles and arithmeticoperators

return c;}int main(){ if (yyparse() != 0)

fprintf(stderr, “Abnormal exit\n”);return 0;

}int yyerror(char *s)

Run the parser

Invoked by parser

80

{ fprintf(stderr, “Error: %s\n”, s);}

Invoked by parserto report parse errors

Page 81: Bottomupparser

Combining Lex/Flex with Yacc/Bison

Yacc or Bisoncompiler

yaccspecificationyacc.y

y.tab.cy.tab.h

Lex or Flexcompiler

Lex specificationlex.l

and token definitionslex.yy.c

lex.yy.c C a out

compilerand token definitionsy.tab.h

lex.yy.cy.tab.c compiler

a.out

81

inputstream a.out

outputstream

Page 82: Bottomupparser

Lex Specification for Example 2%option noyywrap%{#include “y.tab.h” Generated by Yacc, contains

#define NUMBER xxxextern double yylval;%}number [0-9]+\.?|[0-9]*\.[0-9]+%%

#

Defined in y.tab.c%%[ ] { /* skip blanks */ }{number} { sscanf(yytext, “%lf”, &yylval);

return NUMBER;}}

\n|. { return yytext[0]; }

yacc -d example2.ylex example2.l

bison -d -y example2.yflex example2.l

82

gcc y.tab.c lex.yy.c./a.out

gcc y.tab.c lex.yy.c./a.out