+ All Categories
Home > Documents > Bottom-up Parsing. Task Parsing (of course); but do it this way: Bottom-up Easy and algorithmic...

Bottom-up Parsing. Task Parsing (of course); but do it this way: Bottom-up Easy and algorithmic...

Date post: 13-Dec-2015
Category:
Upload: kelley-austin
View: 228 times
Download: 0 times
Share this document with a friend
Popular Tags:
50
Bottom-up Parsing
Transcript

Bottom-up Parsing

Task

Parsing (of course); but do it this way:

• Bottom-up

• Easy and algorithmic

• Efficiently– Knowing (input) as little as possible– Marking errors as soon as possible

• Using a stack explicitly

Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

Lex. An.array [ num ptpt num

Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

array [ num ptpt num Lex. An.

Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

num ptpt num

array [ simple ] Lex. An.of char

Reduction r6

r6

Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

num ptpt num simple

array [ simple ] of char Lex. An.

r6

Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

num ptpt num

char

simple

array [ simple ] of

simple

Lex. An.

Reduction r5

r5

r6

Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

num ptpt num

char

simple

array [ simple ] of simple

type

Lex. An.

r5

r6

Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

num ptpt num

char

simple

array [ simple ] of

type

Lex. An.

type

Reduction r1

r1

r5

r6

Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

num ptpt num

char

simple

array [ simple ] of type

type

type

Lex. An.

r1

r5

r6

Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

num ptpt num

char

simple

type] ofarray [

type $ (no more)

Lex. An.$

type

r1

r5

r6

Reduction r3

r3

array [ num ptpt num ] of char $$

$ array

$ array [

$ array [ num

$ array [ num ptpt

$ array [ num ptpt num

$ array [ simple

$ array [ simple ]

$ array [ simple ] of

$ array [ simple ] of char

$ array [ simple ] of simple

$ array [ simple ] of type

$ type

stack

[ num ptpt num ] of char $

num ptpt num ] of char $

ptpt num ] of char $

num ] of char $

] of char $

] of char $

of char $

char $

$

$

$

$

input

shift

shift

shift

shift

shift

reduce 6

shift

shift

shift

reduce 5

reduce 1

reduce 3

OK

action

simple

num ptpt num

array [ num ptpt num ] of char

Lex. An.array [ num ptpt num

simple

num ptpt num

char

simple

array [ num ptpt num ] of char

array [ simple ] of char

Lex. An.array [ simple ] of char

simple

num ptpt num

char

simple

type

array [ num ptpt num ] of char

array [ simple ] of char

array [ simple ] of simple

Lex. An.array [ simplesimple of]

simple

num ptpt num

char

simple

type

array [ num ptpt num ] of char

array [ simple ] of char

array [ simple ] of simple

Lex. An.array [ typesimple of]

array [ simple ] of type

] ofarray [

typetype

simple

num ptpt num

char

simple

type

array [ num ptpt num ] of char

array [ simple ] of char

array [ simple ] of simple

Lex. An.

array [ simple ] of type

] ofarray [

typetype

type

type

simple

num ptpt num

char

simple

type

array [ num ptpt num ] of char

array [ simple ] of char

array [ simple ] of simple

Lex. An.

array [ simple ] of type

] ofarray [

typetype

type

type

═>rm

═>rm

═>rm

═>rm terminals

Wrong example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

Lex. An.array [ num ptpt num

Wrong Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

array [ num ptpt num Lex. An.

Wrong Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

num ptpt num

array [ simple Lex. An.

Wrong Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

num ptpt num

array [ simple Lex. An.

type

Wrong Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

num ptpt num

array [

type

Lex. An.

type

] of char

Wrong Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

num ptpt num simple

array [ type ] of char Lex. An.

type

Wrong Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

num ptpt num

char

simple

array [ type ] of

simple

Lex. An.

type

Wrong Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

num ptpt num

char

simple

array [ type ] of simple

type

Lex. An.

type

Wrong Example

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

simple

num ptpt num

char

simple

array [ type ] of

type

Lex. An.

type

type

$

?

array [ num ptpt num ] of char

array [ simple ] of char

array [ simple ] of simple

array [ simple ] of type

simple

num ptpt num

char

simple

type] ofarray [

typetype

type

═>6

═>5

═>1

═>3

handle

handle

handle

handle

array [ num ptpt num ] of char $$

$ array

$ array [

$ array [ num

$ array [ num ptpt

$ array [ num ptpt num

$ array [ simple

$ array [ simple ]

$ array [ simple ] of

$ array [ simple ] of char

$ array [ simple ] of simple

$ array [ simple ] of type

$ type

stack

[ num ptpt num ] of char $

num ptpt num ] of char $

ptpt num ] of char $

num ] of char $

] of char $

] of char $

of char $

char $

$

$

$

$

input

shift

shift

shift

shift

shift

reduce 6

shift

shift

shift

reduce 5

reduce 1

reduce 3

OK

action

handle

handle

handle

handle

What is the handle?

Shift or Reduce?If Reduce, which rule?

=

Knowingread input (and actions done), and (at most) the next input symbol

Some tips

type → simple | ^ simple | array [simple] of type

simple → integer | char | num ptpt num

reduce type → simple

Don’t reduce type → simple after [When there is simple at the top of the stack :

after of

when the next input symbol is $

or mark error

if the next input symbol is not ] nor $

Marking errors as soon as possible

Knowing (input) as little as possible

How to decide shift-reducetype → simple | ^ simple | array [simple] of typesimple → integer | char | num ptpt num

• At the beginning (state 0):– Shift on integer, char, num. (state 1)– Shift on array (state2)– otherwise Mark error

• State1 (integer, char, num on top):– If num on top, shift on ptpt (state 3), mark error otherwise– Else, reduce by 4 or 5,depending on the symbol at the top

• State 2 (array on top) :– Shift on [ (state 4)– Mark error otherwise

• State 3 (num ptpt on top) – Shift on num (state 5)– Mark error otherwise

• …

Let Yacc do it

S → c S A d | d

A → a B | a

B → a | b

S

S A dc

d a

S

S A dc

d a

A dc

S

B

a

a

c d a d c c d a a d a d

c S a d

c S A d

S

S → d

A → a

S → cSAd

S

S A dc

d a

c d a d $$

$ c

$ c d

$ c S

$ c S a

$ c S A

$ c S A d

$ S

stack

d a d $

a d $

a d $

d $

d $

$

$

inputshift

shift

reduce 2: S → d

shift

reduce 4: A → a

shift

reduce 1: S → cSAd

OK

action

c d a d

c S a d

c S A d

S

S → d

A → a

S → cSAddc

d a

S

S A

═>rm

═>rm

═>rm

c d a d $$

$ c

$ c d

$ c S

$ c S a

$ c S A

$ c S A d

$ S

stack

d a d $

a d $

a d $

d $

d $

$

$

inputshift

shift

reduce 2: S → d

shift

reduce 4: A → a

shift

reduce 1: S → cSAd

OK

action

LR (1)LALR(1) ∩YACC →

S

S A dc

d a

c d a d $$ 0

$ 0 c 1

$ 0 c 1 d 2

$ 0 c 1 S 4

$ 0 c 1 S 4 a 5

$ 0 c 1 S 4 A 6

$ 0 c 1 S 5 A 6 d 10

$ 0 S 3

stack

d a d $

a d $

a d $

d $

d $

$

$

inputshift 1

shift 2

reduce 2: S → d; goto [1, S] = 4

shift 5

reduce 4: A → a; goto [4, A] = 6

shift 10

reduce 1: S → cSAd; goto [0, S] = 3

OK

action

dc

d a

S

S A1

0

2

4

5

6 10

3

Action GoTo

a b c d $ S A B

0 s1 s2 3

1 s1 s2 4

2 r2 r2 r2 r2 r2

3 OK

4 s5 6

5 s7 s8 r4 9

6 s10

7 r5 r5 r5 r5 r5

8 r6 r6 r6 r6 r6

9 r3 r3 r3 r3 r3

10 r1 r1 r1 r1 r1

S

S A dc

d a

c d a d $$ 0

$ 0 c 1

$ 0 c 1 d 2

$ 0 c 1 S 4

$ 0 c 1 S 4 a 5

$ 0 c 1 S 4 A 6

$ 0 c 1 S 5 A 6 d 10

$ 0 S 3

stack

d a d $

a d $

a d $

d $

d $

$

$

inputshift 1

shift 2

reduce 2: S → d; goto [1, S] = 4

shift 5

reduce 4: A → a; goto [4, A] = 6

shift 10

reduce 1: S → cSAd; goto [0, S] = 3

OK

action

dc

d a

S

S A1

0

2

4

5

6 10

3

Action GoTo

a b c d $ S A B

0 s1 s2 3

1 s1 s2 4

2 r2 r2 r2 r2 r2

3 OK

4 s5 6

5 s7 s8 r4 9

6 s10

7 r5 r5 r5 r5 r5

8 r6 r6 r6 r6 r6

9 r3 r3 r3 r3 r3

10 r1 r1 r1 r1 r1

Action GoTo

a b c d $ S A B

0 s1 s2 3

1 s1 s2 4

2 r2r2 r2 r2 r2

3 OK

4s5 6

5 s7 s8 r4 9

6 s10

7 r5 r5 r5 r5 r5

8 r6 r6 r6 r6 r6

9 r3 r3 r3 r3 r3

10 r1 r1 r1 r1 r1

0: $accept : . S $end (0)

1: S : c . S A d (1)

2: S : d . (2)

4: S : c S . A d (1)

3: $accept : S . $end (0)

5: A : a . B (3) A : a . (4)

6: S : c S A . d (1)

7: B : a . (5)

8: B : b . (6)

9: A : a B . (3)

10: S : c S A d . (1)

(Rule number)

State number

Meaning

S

S A dc

d a

c d a d $$ 0

$ 0 c 1

$ 0 c 1 d 2

$ 0 c 1 S 4

$ 0 c 1 S 4 a 5

$ 0 c 1 S 4 A 6

$ 0 c 1 S 5 A 6 d 10

$ 0 S 3

stack

d a d $

a d $

a d $

d $

d $

$

$

inputshift 1

shift 2

reduce 2: S → d; goto [1, S] = 4

shift 5

reduce 4: A → a; goto [4, A] = 6

shift 10

reduce 1: S → cSAd; goto [0, S] = 3

OK

action

dc

d a

S

S A1

0

2

4

5

6 10

3

Action GoTo

a b c d $ S A B

0 s1 s2 3

1 s1 s2 4

2 r2 r2 r2 r2 r2

3 OK

4 s5 6

5 s7 s8 r4 9

6 s10

7 r5 r5 r5 r5 r5

8 r6 r6 r6 r6 r6

9 r3 r3 r3 r3 r3

10 r1 r1 r1 r1 r1

0: $accept : . S $end (0)

1: S : c . S A d (1)2: S : d . (2)

S

S A dc

d a

c d a d $ 0

0 1

0 1 2

0 1 4

0 1 4 5

0 1 4 6

0 1 5 6 10

0 3

stack

d a d $

a d $

a d $

d $

d $

$

$

inputshift 1

shift 2

reduce 2: S → d; goto [1, S] = 4

shift 5

reduce 4: A → a; goto [4, A] = 6

shift 10

reduce 1: S → cSAd; goto [0, S] = 3

OK

action

dc

d a

S

S A1

0

2

4

5

6 10

3

Action GoTo

a b c d $ S A B

0 s1 s2 3

1 s1 s2 4

2 r2 r2 r2 r2 r2

3 OK

4 s5 6

5 s7 s8 r4 9

6 s10

7 r5 r5 r5 r5 r5

8 r6 r6 r6 r6 r6

9 r3 r3 r3 r3 r3

10 r1 r1 r1 r1 r1

S → cAba | cbbb | bA A → b

S

c b aA

b

S

c b bb

S

b A

b

S ═> cAba cbba═> S ═> cbbb S ═> bA bb═>

b$ b bb $ Lex. An.

Conflicts

$

Conflicts

S

c b aA

b

S

c b bb

S

b A

b

S ═> cAba cbba═> S ═> cbbb S ═> bA bb═>

Lex. An.$ b $A

S → cAba | cbbb | bA A → b

$

Conflicts

S

c b aA

b

S

c b bb

S

b A

b

S ═> cAba cbba═> S ═> cbbb S ═> bA bb═>

Lex. An.$ S $

S → cAba | cbbb | bA A → b

Conflicts

S

c b aA

b

S

c b bb

S

b A

b

S ═> cAba cbba═> S ═> cbbb S ═> bA bb═>

Lex. An.c$ c bb bshift/reduce conflict

S → cAba | cbbb | bA A → b

Conflicts

S

c b aA

b

S

c b bb

S ═> cAba cbba═> S ═> cbbb

Lex. An.$ c bb shift/reduce conflict

4: shift/reduce conflict (shift 8, reduce 4) on ‘b’state 4

S :’c’ ‘b’ . ’b’ ‘b’ (2)A : ‘b’ . (4)

S → cAba | cbbb | bA A → b

Conflicts

S

c b aA

b

S ═> cAba cbba═>

S → cAba | cBbb | bB A → b B → ε

c Lex. An.$ c bshift/reduce conflict

S

c b bB

ε

S ═> cBbb c bb═>

Conflicts

S

c b aA

b

S ═> cAba cbba═>

S → cAba | cBbb | bB A → b B → ε

S

c b bB

ε

S ═> cBbb c bb═>

c Lex. An.$ c bshift/reduce conflict

1: shift/reduce conflict (shift 4, reduce 5) on ‘b’state 1

S :’c’ . A ’b’ ‘a’ (1)S :’c’ . B ’b’ ‘b’ (2)B : . (5)

Conflicts

S

c b aA

b

S ═> cAba cbba═>

S

c b bB

b

S ═> cBbb cbbb═>

S → cAba | cBbb | bB A → b | a B → b

c Lex. An.$ c bb breduce/reduce conflict

Conflicts

S

c b aA

b

S ═> cAba cbba═>

S

c b bB

b

S ═> cBbb cbbb═>

S → cAba | cBbb | bB A → b | a B → b

Lex. An.$ c b breduce/reduce conflict

4: reduce/reduce conflict (reduce 4, reduce 6) on ‘b’state 4

A : ‘b’ . (4)B : ‘b’ . (6)


Recommended