Date post: | 13-Dec-2015 |
Category: |
Documents |
Upload: | kelley-austin |
View: | 228 times |
Download: | 0 times |
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
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