0% found this document useful (0 votes)
2 views

Ch4b

The document discusses bottom-up parsing techniques in compiler construction, focusing on LR methods such as SLR, Canonical LR, and LALR. It explains shift-reduce parsing, including the concepts of handles and conflicts that can arise during parsing. Additionally, it describes the implementation of shift-reduce parsing using a stack and DFA for decision-making.

Uploaded by

meaad mohammed
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views

Ch4b

The document discusses bottom-up parsing techniques in compiler construction, focusing on LR methods such as SLR, Canonical LR, and LALR. It explains shift-reduce parsing, including the concepts of handles and conflicts that can arise during parsing. Additionally, it describes the implementation of shift-reduce parsing using a stack and DFA for decision-making.

Uploaded by

meaad mohammed
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 55

1

Syntax Analysis
Part II

Chapter 4

COP5621 Compiler Construction


Copyright Robert van Engelen, Florida State University, 2007-2011

2

Bottom-Up Parsing

• LR methods (Left-to-right, Rightmost
derivation)

– SLR, Canonical LR, LALR

• Other special cases:

– Shift-reduce parsing

– Operator-precedence parsing

3

Operator-Precedence Parsing

• Special case of shift-reduce parsing

• We will not further discuss (you can skip
textbook section 4.6)

4

Shift-Reduce Parsing

Grammar: Reducing a sentence: Shift-reduce corresponds
S → a A B e a b b c d e to a rightmost derivation:
A → A b c | b a A b c d e S ⇒rm a A B e
B → d
a A d e ⇒rm a A d e
a A B e ⇒rm a A b c d e
These match S
⇒rm a b b c d e

production’s
right-hand sides

S

A
A
A

A
A
A
B
A
B

a b b c d e
a b b c d e
a b b c d e
a b b c d e

5

Handles

A handle is a substring of grammar symbols in a
right-sentential form that matches a right-hand side
of a production

Grammar: a b b c d e
S → a A B e a A b c d e
A → A b c | b a A d e Handle

B → d
a A B e
S

a b b c d e
a A b c d e NOT a handle, because
a A A e further reductions will fail

… ?
(result is not a sentential form)

6

Stack Implementation of


Shift-Reduce Parsing

Stack
Input
Action
$ id+id*id$ shift
$id
+id*id$ reduce E → id How to
Grammar: $E +id*id$ shift
$E+ id*id$ shift
resolve
E → E + E conflicts?

$E+id *id$ reduce E → id
E → E * E $E+E *id$ shift (or reduce?)
E → ( E ) $E+E* id$ shift
E → id
$E+E*id $ reduce E → id
$E+E*E $ reduce E → E * E
$E+E $ reduce E → E + E
Find handles $E
$
accept

to reduce

7

Conflicts

• Shift-reduce and reduce-reduce conflicts are
caused by

– The limitations of the LR parsing method (even
when the grammar is unambiguous)

– Ambiguity of the grammar

8

Shift-Reduce Parsing:
Shift-Reduce Conflicts

Stack
Input
Action
$… …$ …
$…if E then S
else…$
shift or reduce?

Ambiguous grammar:
S → if E then S
| if E then S else S
| other

Resolve in favor
of shift, so else
matches closest if

9

Shift-Reduce Parsing:
Reduce-Reduce Conflicts

Stack
Input
Action
$ aa$ shift
$a
a$
reduce A → a or B → a ?

Grammar:
C → A B
A → a
B → a

Resolve in favor
of reduce A → a,
otherwise we’re stuck!

10

LR(k) Parsers: Use a DFA for


Shift/Reduce Decisions

1

C
4

B

start
A

0
2
State I1:
a
State I4:
a
5
S → C•
C → A B•

goto(I0,C)

3

Grammar: goto(I2,B)

State I0:
S → C State I2:
S → •C  goto(I 0,A)

C → A B C → A•B
C → •A B
A → a B → •a
goto(I ,a)

A → •a
2
B → a

Can only goto(I0,a)
State I : State I5:
3
reduce A → a A → a•
B → a•

(not B → a)

11

DFA for Shift/Reduce Decisions



The states of the DFA are used to determine
Grammar: if a handle is on top of the stack

S → C
Stack
Input
Action
C → A B
$ 0 aa$ start in state 0
A → a $ 0 aa$ shift (and goto state 3)
B → a
$ 0 a 3 a$ reduce A → a (goto 2)
$ 0 A 2 a$ shift (goto 5)
State I0: goto(I0,a)
$ 0 A 2 a 5 $ reduce B → a (goto 4)
$ 0 A 2 B 4 $ reduce C → AB (goto 1)
S → •C  State I3: $ 0 C 1
$
accept (S → C)

C → •A B A → a•

A → •a

12

DFA for Shift/Reduce Decisions



The states of the DFA are used to determine
Grammar: if a handle is on top of the stack

S → C
Stack
Input
Action
C → A B
$ 0 aa$ start in state 0
A → a $ 0 aa$ shift (and goto state 3)
B → a
$ 0 a 3 a$ reduce A → a (goto 2)
$ 0 A 2 a$ shift (goto 5)
$ 0 A 2 a 5 $ reduce B → a (goto 4)
State I0: goto(I0,A)
$ 0 A 2 B 4 $ reduce C → AB (goto 1)
S → •C  State I2: $ 0 C 1
$
accept (S → C)

C → •A B C → A•B
A → •a
B → •a

13

DFA for Shift/Reduce Decisions



The states of the DFA are used to determine
Grammar: if a handle is on top of the stack

S → C
Stack
Input
Action
C → A B
$ 0 aa$ start in state 0
A → a $ 0 aa$ shift (and goto state 3)
B → a
$ 0 a 3 a$ reduce A → a (goto 2)
$ 0 A 2 a$ shift (goto 5)
$ 0 A 2 a 5 $ reduce B → a (goto 4)
$ 0 A 2 B 4 $ reduce C → AB (goto 1)
goto(I2,a)
$ 0 C 1
$
accept (S → C)

State I2:
C → A•B State I5:
B → •a
B → a•

14

DFA for Shift/Reduce Decisions



The states of the DFA are used to determine
Grammar: if a handle is on top of the stack

S → C
Stack
Input
Action
C → A B
$ 0 aa$ start in state 0
A → a $ 0 aa$ shift (and goto state 3)
B → a
$ 0 a 3 a$ reduce A → a (goto 2)
$ 0 A 2 a$ shift (goto 5)
$ 0 A 2 a 5 $ reduce B → a (goto 4)
$ 0 A 2 B 4 $ reduce C → AB (goto 1)
goto(I2,B)
$ 0 C 1
$
accept (S → C)

State I2:
C → A•B State I4:
B → •a
C → A B•

15

DFA for Shift/Reduce Decisions



The states of the DFA are used to determine
Grammar: if a handle is on top of the stack

S → C
Stack
Input
Action
C → A B
$ 0 aa$ start in state 0
A → a $ 0 aa$ shift (and goto state 3)
B → a
$ 0 a 3 a$ reduce A → a (goto 2)
$ 0 A 2 a$ shift (goto 5)
$ 0 A 2 a 5 $ reduce B → a (goto 4)
$ 0 A 2 B 4 $ reduce C → AB (goto 1)
goto(I0,C)
$ 0 C 1
$
accept (S → C)

State I0:
S → •C  State I1:
C → •A B S → C•

A → •a

16

DFA for Shift/Reduce Decisions



The states of the DFA are used to determine
Grammar: if a handle is on top of the stack

S → C
Stack
Input
Action
C → A B
$ 0 aa$ start in state 0
A → a $ 0 aa$ shift (and goto state 3)
B → a
$ 0 a 3 a$ reduce A → a (goto 2)
$ 0 A 2 a$ shift (goto 5)
$ 0 A 2 a 5 $ reduce B → a (goto 4)
$ 0 A 2 B 4 $ reduce C → AB (goto 1)
goto(I0,C)
$ 0 C 1
$
accept (S → C)

State I0:
S → •C  State I1:
C → •A B S → C•

A → •a

17

Model of an LR Parser

input
a1
a2

ai

an
$

stack

LR Parsing Program
sm
(driver)
output

Xm

sm-1

Xm-1
action
goto
Constructed with


LR(0) method,

shift DFA
SLR method,

s0
reduce LR(1) method, or

accept LALR(1) method

error

18

LR Parsing (Driver)

Configuration ( = LR parser state):

(s0 X1 s1 X2 s2 … Xm sm, ai ai+1 … an $)

stack
input

If action[sm,ai] = shift s then push ai, push s, and advance input:

(s0 X1 s1 X2 s2 … Xm sm ai s, ai+1 … an $)

If action[sm,ai] = reduce A → β and goto[sm-r,A] = s with r=|β| then


pop 2r symbols, push A, and push s:

(s0 X1 s1 X2 s2 … Xm-r sm-r A s, ai ai+1 … an $)

If action[sm,ai] = accept then stop

If action[sm,ai] = error then attempt recovery

19

Example LR Parse Table



action
goto

Grammar: state
id
+
*
(
)
$
E
T
F

1. E → E + T 0
s5
s4
1
2
3

2. E → T 1
s6
acc

3. T → T * F
2
r2
s7
r2
r2

4. T → F
3
r4
r4
r4
r4

5. F → ( E )
4
s5
s4
8
2
3

6. F → id

5
r6
r6
r6
r6

6
s5
s4
9
3

Shift & goto 5
7
s5
s4
10

8
s6
s11

9
r1
s7
r1
r1

Reduce by
10
r3
r3
r3
r3

production #1

11
r5
r5
r5
r5

20

Example LR Parsing

Stack
Input
Action
$ 0 id*id+id$ shift 5
$ 0 id 5 *id+id$ reduce 6 goto 3
Grammar: $ 0 F 3 *id+id$ reduce 4 goto 2
$ 0 T 2 *id+id$ shift 7
1. E → E + T
$ 0 T 2 * 7 id+id$ shift 5
2. E → T $ 0 T 2 * 7 id 5 +id$ reduce 6 goto 10
3. T → T * F $ 0 T 2 * 7 F 10 +id$ reduce 3 goto 2
4. T → F $ 0 T 2 +id$ reduce 2 goto 1
5. F → ( E ) $ 0 E 1 +id$ shift 6
$ 0 E 1 + 6 id$ shift 5
6. F → id

$ 0 E 1 + 6 id 5 $ reduce 6 goto 3
$ 0 E 1 + 6 F 3 $ reduce 4 goto 9
$ 0 E 1 + 6 T 9 $ reduce 1 goto 1
$ 0 E 1
$
accept

21

SLR Grammars

• SLR (Simple LR): SLR is a simple
extension of LR(0) shift-reduce parsing

• SLR eliminates some conflicts by
populating the parsing table with reductions
A→α on symbols in FOLLOW(A)
Shift on +

State I2:
State I0:
S → •E  goto(I0,id)
E → id•+ E goto(I3,+)

S → E
E → id•

E → id + E E → •id + E
E → id
E → •id
FOLLOW(E)={$}
thus reduce on $

22

SLR Parsing Table



• Reductions do not fill entire rows

• Otherwise the same as LR(0)

id
+
$
E

0
s2
1

1. S → E 1
acc

2. E → id + E 2
s3
r3

3. E → id

3
s2
4

4
r2

Shift on +

FOLLOW(E)={$}
thus reduce on $

23

SLR Parsing

• An LR(0) state is a set of LR(0) items

• An LR(0) item is a production with a • (dot) in the
right-hand side

• Build the LR(0) DFA by

– Closure operation to construct LR(0) items

– Goto operation to determine transitions

• Construct the SLR parsing table from the DFA

• LR parser program uses the SLR parsing table to
determine shift/reduce operations

24

Constructing SLR Parsing Tables



1. Augment the grammar with S’→S

2. Construct the set C={I0,I1,…,In} of LR(0) items

3. If [A→α•aβ] ∈ Ii and goto(Ii,a)=Ij then set
action[i,a]=shift j

4. If [A→α•] ∈ Ii then set action[i,a]=reduce A→α
for all a ∈ FOLLOW(A) (apply only if A≠S’)

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

6. If goto(Ii,A)=Ij then set goto[i,A]=j

7. Repeat 3-6 until no more entries added

8. The initial state i is the Ii holding item [S’→•S]

25

LR(0) Items of a Grammar



• An LR(0) item of a grammar G is a production of
G with a • at some position of the right-hand side

• Thus, a production

A → X Y Z
has four items:

[A → • X Y Z]

[A → X • Y Z] 

[A → X Y • Z] 

[A → X Y Z •]

• Note that production A → ε has one item [A → •]

26

Constructing the set of LR(0)


Items of a Grammar

1. The grammar is augmented with a new start
symbol S’ and production S’→S

2. Initially, set C = closure({[S’→•S]})
(this is the start state of the DFA)

3. For each set of items I ∈ C and each grammar
symbol X ∈ (N∪T) such that goto(I,X) ∉ C and
goto(I,X) ≠ ∅, add the set of items goto(I,X) to C

4. Repeat 3 until no more sets can be added to C

27

The Closure Operation for LR(0)


Items

1. Start with closure(I) = I

2. If [A→α•Bβ] ∈ closure(I) then for each
production B→γ in the grammar, add the
item [B→•γ] to I if not already in I

3. Repeat 2 until no new items can be added

28

The Closure Operation


(Example)

closure({[E’ → •E]}) =

{ [E’ → • E] }
{ [E’ → • E] { [E’ → • E] { [E’ → • E]
[E → • E + T] [E → • E + T] [E → • E + T]
[E → • T] }
[E → • T] [E → • T]
[T → • T * F] [T → • T * F]
Add [E→•γ]
[T → • F] }
[T → • F]
Add [T→•γ]
[F → • ( E )]
Grammar: Add [F→•γ]
[F → • id] }

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

29

The Goto Operation for LR(0)


Items

1. For each item [A→α•Xβ] ∈ I, add the set
of items closure({[A→αX•β]}) to
goto(I,X) if not already there

2. Repeat step 1 until no more items can be
added to goto(I,X)

3. Intuitively, goto(I,X) is the set of items
that are valid for the viable prefix γX when
I is the set of items that are valid for γ

30

The Goto Operation (Example 1)


Suppose I =
{ [E’ → • E] Then goto(I,E)
[E → • E + T] = closure({[E’ → E •, E → E • + T]})
[E → • T] =
{ [E’ → E •]
[T → • T * F] [E → E • + T] }

[T → • F]
[F → • ( E )]
[F → • id] }
Grammar:
E → E + T | T
T → T * F | F
F → ( E )
F → id

31

The Goto Operation (Example 2)


Suppose I = { [E’ → E •], [E → E • + T] }


Then goto(I,+) = closure({[E → E + • T]}) =


{ [E → E + • T]
[T → • T * F]
[T → • F]
[F → • ( E )]
[F → • id] }

Grammar:
E → E + T | T
T → T * F | F
F → ( E )
F → id

32

Example SLR Grammar and


LR(0) Items

Augmented I0 = closure({[C’ → •C]})
grammar: I1 = goto(I0,C) = closure({[C’ → C•]})
1. C’ → C …

2. C → A B State I1:
final
State I4:
3. A → a C’ → C•

goto(I0,C)
C → A B•

4. B → a

State I0: goto(I2,B)

State I2:
start
C’ → •C  goto(I 0,A)

C → A•B
C → •A B
B → •a
goto(I ,a)

A → •a
2

goto(I0,a)
State I3: State I5:
A → a•
B → a•

33

Example SLR Parsing Table



State I0: State I1: State I2: State I3: State I4: State I5:
C’ → •C  C’ → C•
C → A•B A → a•
C → A B•
B → a•

C → •A B B → •a

A → •a

a
$
C
A
B

1
0
s3
1
2

Grammar:
C
4
1
acc

B
1. C’ → C
start
A
2
s5
4

0
2
2. C → A B
a
3
r3
3. A → a
a
5

4
r2
4. B → a

3
5
r4

34

SLR and Ambiguity



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

• Consider for example the unambiguous grammar

1. S → L = R
2. S → R

3. L → * R

4. L → id

5. R → L
I0: I1: I2: I3: I4: I5: I6: I7:
S’ → •S  S’ → S•
S → L•=R S → R•
L → *•R  L → id•
S → L=•R L → *R•

S → •L=R R → L•
R → •L
R → •L 
S → •R L → •*R  L → •*R  I8:
L → •*R  L → •id
L → •id
R → L•

L → •id
action[2,=]=s6 Has no SLR I9:
R → •L

no
S → L=R•

action[2,=]=r5
parsing table

35

LR(1) Grammars

• SLR too simple

• LR(1) parsing uses lookahead to avoid
unnecessary conflicts in parsing table

• LR(1) item = LR(0) item + lookahead

LR(0) item: LR(1) item:
[A→α•β]
[A→α•β, a]

36

SLR Versus LR(1)



• Split the SLR states by
adding LR(1) lookahead
I2:
S → L•=R split

• Unambiguous grammar R → L•

1.
S → L = R
lookahead=$

2.
S → R S → L•=R
R → L•

3.
L → * R
4.
L → id
action[2,=]=s6
action[2,$]=r5

5.
R → L

Should not reduce on =, because no
right-sentential form begins with R=

37

LR(1) Items

• An LR(1) item

[A→α•β, a]
contains a lookahead terminal a, meaning α
already on top of the stack, expect to see βa

• For items of the form

[A→α•, a]
the lookahead a is used to reduce A→α only if the
next input is a

• For items of the form

[A→α•β, a]
with β≠ε the lookahead has no effect

38

The Closure Operation for LR(1)


Items

1. Start with closure(I) = I

2. If [A→α•Bβ, a] ∈ closure(I) then for each
production B→γ in the grammar and each
terminal b ∈ FIRST(βa), add the item
[B→•γ, b] to I if not already in I

3. Repeat 2 until no new items can be added

39

The Goto Operation for LR(1)


Items

1. For each item [A→α•Xβ, a] ∈ I, add the
set of items closure({[A→αX•β, a]}) to
goto(I,X) if not already there

2. Repeat step 1 until no more items can be
added to goto(I,X)

40

Constructing the set of LR(1)


Items of a Grammar

1. Augment the grammar with a new start symbol
S’ and production S’→S

2. Initially, set C = closure({[S’→•S, $]})
(this is the start state of the DFA)

3. For each set of items I ∈ C and each grammar
symbol X ∈ (N∪T) such that goto(I,X) ∉ C and
goto(I,X) ≠ ∅, add the set of items goto(I,X) to C

4. Repeat 3 until no more sets can be added to C

41

Example Grammar and LR(1)


Items

• Unambiguous LR(1) grammar:

S → L = R

S → R

L → * R

L → id

R → L

• Augment with S’ → S

• LR(1) items (next slide)

42

I0:
[S’ → •S,
$] goto(I0,S)=I1  I6:
[S → L=•R,
$] goto(I6,R)=I9 
[S → •L=R,
$] goto(I0,L)=I2  [R → •L,

$] goto(I6,L)=I10

[S → •R,

$] goto(I0,R)=I3  [L → •*R,
$] goto(I6,*)=I11 
[L → •*R,
=/$] goto(I0,*)=I4  [L → •id,
$] goto(I6,id)=I12 
[L → •id,
=/$] goto(I0,id)=I5 
[R → •L,

$] goto(I0,L)=I2  I7:
[L → *R•,
=/$]

I1:
[S’ → S•,
$] I8:
[R → L•,

=/$]

I2:
[S → L•=R,
$] goto(I0,=)=I6  I9:
[S → L=R•,
$]
[R → L•,

$]
I10:
[R → L•,

$]
I3:
[S → R•,

$]
I11:
[L → *•R,
$] goto(I11,R)=I13
I4:
[L → *•R,
=/$] goto(I4,R)=I7  [R → •L,

$] goto(I11,L)=I10
[R → •L,

=/$] goto(I4,L)=I8  [L → •*R,
$] goto(I11,*)=I11
[L → •*R,
=/$] goto(I4,*)=I4  [L → •id,
$] goto(I11,id)=I12
[L → •id,
=/$] goto(I4,id)=I5 
I12:
[L → id•,
$]
I5:
[L → id•,
=/$]

I13:
[L → *R•,
$]

43

Constructing Canonical LR(1)


Parsing Tables

1. Augment the grammar with S’→S

2. Construct the set C={I0,I1,…,In} of LR(1) items

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

4. If [A→α•, a] ∈ Ii then set action[i,a]=reduce
A→α (apply only if A≠S’)

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

6. If goto(Ii,A)=Ij then set goto[i,A]=j

7. Repeat 3-6 until no more entries added

8. The initial state i is the Ii holding item [S’→•S,$]

44

Example LR(1) Parsing Table



id
*
=
$
S
L
R

0
s5
s4
1
2
3

1
acc

2
s6
r6

3
r3

Grammar:
1. S’ → S 4
s5
s4
8
7

2. S → L = R 5
r5
r5

3. S → R 6
s12
s11
10
9

4. L → * R 7
r4
r4

5. L → id 8
r6
r6

6. R → L
9
r2

10
r6

11
s12
s11
10
13

12
r5

13
r4

45

LALR(1) Grammars

• LR(1) parsing tables have many states

• LALR(1) parsing (Look-Ahead LR) combines two
or more LR(1) sets into one to reduce table size

• Less powerful than LR(1)

– Will not introduce shift-reduce conflicts, because shifts
do not use lookaheads

– May introduce reduce-reduce conflicts, but seldom do
so for grammars of programming languages

46

Constructing LALR(1) Parsing


Tables

1. Construct sets of LR(1) items

2. Combine LR(1) sets with sets of items that
share the same first part

I4:
[L → *•R,
=/$]
[R → •L,

=/$]  Shorthand
[L → •*R,
=/$] 
[L → *•R,
=/$] for two items
[L → •id,
=/$]

[R → •L,

=/$] in the same set

[L → •*R,
=/$]
I11:
[L → *•R,
$]
[L → •id,
=/$]

[R → •L,

$]
[L → •*R,
$]
[L → •id,
$]

47

Example LALR(1) Grammar



• Unambiguous LR(1) grammar:

S → L = R
| R

L → * R
| id

R → L

• Augment with S’ → S

• LALR(1) items (next slide)

48

I0:
[S’ → •S,
$] goto(I0,S)=I1  I6:
[S → L=•R,
$] goto(I6,R)=I8 
[S → •L=R,
$] goto(I0,L)=I2  [R → •L,

$] goto(I6,L)=I9

[S → •R,

$] goto(I0,R)=I3  [L → •*R,
$] goto(I6,*)=I4 
[L → •*R,
=/$] goto(I0,*)=I4  [L → •id,
$] goto(I6,id)=I5 
[L → •id,
=/$] goto(I0,id)=I5 
[R → •L,

$] goto(I0,L)=I2  I7:
[L → *R•,
=/$]

I1:
[S’ → S•,
$] I8:
[S → L=R•,
$]

I2:
[S → L•=R,
$] goto(I0,=)=I6  I9:
[R → L•,

=/$]

[R → L•,

$]
Shorthand
I3:
[S → R•,

$]
for two items

I4:
[L → *•R,
=/$] goto(I4,R)=I7  [R → L•,

=]
[R → •L,

=/$] goto(I4,L)=I9  [R → L•,

$]

[L → •*R,
=/$] goto(I4,*)=I4 
[L → •id,
=/$] goto(I4,id)=I5 

I5:
[L → id•,
=/$]

49

Example LALR(1) Parsing Table


id
*
=
$
S
L
R

0
s5
s4
1
2
3

Grammar: 1
acc

1. S’ → S 2
s6
r6

2. S → L = R 3
r3

3. S → R 4
s5
s4
9
7

4. L → * R 5
r5
r5

5. L → id 6
s5
s4
9
8

6. R → L
7
r4
r4

8
r2

9
r6
r6

50

LL, SLR, LR, LALR Summary



• LL parse tables computed using FIRST/FOLLOW

– Nonterminals × terminals → productions

– Computed using FIRST/FOLLOW

• LR parsing tables computed using closure/goto

– LR states × terminals → shift/reduce actions

– LR states × nonterminals → goto state transitions

• A grammar is

– LL(1) if its LL(1) parse table has no conflicts

– SLR if its SLR parse table has no conflicts

– LALR(1) if its LALR(1) parse table has no conflicts

– LR(1) if its LR(1) parse table has no conflicts

51

LL, SLR, LR, LALR Grammars


LR(1)

LALR(1)

LL(1)

SLR

LR(0)

52

Dealing with Ambiguous


Grammars

stack
input

1. S’ → E id
+
$
E
$ 0
id+id+id$

2. E → E + E 0
s2
1



3. E → id
1
s3
acc
$ 0 E 1 + 3 E 4
+id$

2
r3
r3

3
s2
4




4
s3/r2
r2

When shifting on +:
yields right associativity
id+(id+id)

Shift/reduce conflict: When reducing on +:
action[4,+] = shift 4 yields left associativity
action[4,+] = reduce E → E + E
(id+id)+id

53

Using Associativity and


Precedence to Resolve Conflicts

• Left-associative operators: reduce

• Right-associative operators: shift

• Operator of higher precedence on stack: reduce

• Operator of lower precedence on stack: shift

stack
input

$ 0
id*id+id$

S’ → E
E → E + E …


E → E * E $ 0 E 1 * 3 E 5
+id$
reduce E → E * E

E → id





54

Error Detection in LR Parsing



• Canonical LR parser uses full LR(1) parse
tables and will never make a single
reduction before recognizing the error when
a syntax error occurs on the input

• SLR and LALR may still reduce when a
syntax error occurs on the input, but will
never shift the erroneous input symbol

55

Error Recovery in LR Parsing



• Panic mode

– Pop until state with a goto on a nonterminal A is found,
(where A represents a major programming construct),
push A

– Discard input symbols until one is found in the
FOLLOW set of A

• Phrase-level recovery

– Implement error routines for every error entry in table

• Error productions

– Pop until state has error production, then shift on stack

– Discard input until symbol is encountered that allows
parsing to continue

You might also like