1 The grammar G
i) L E C F V T
ii) a b c d 0 1 2 3 if + – * print ( ) iii) L
iv) L → E → (C) → (if E E) → (if (F) E )
→ (if (-L) E ) → (if (-LE) E ) → (if (-EE) E )
→ (if (-TE) E ) → (if (-1E) E )
→ (if (-1V) E ) → (if (-1a) E ) → (if (-1a) (F) ) → (if (-1a) (print L) ) → (if (-1a) (print E) ) → (if (-1a) (print T) ) → (if (-1a) (print 1) )
v)
2 Prove G is not LL(1)
L → LE is left recursive, thus G is not LL(1).
3 Find an equivalent LL(1) grammar G′
using left factoring E → (E’ | V | T
E’ → C) | F)
C → if E E C’
C’ → E | ε
remove left recursive L → EL’
L’ → EL’ | ε
Above steps result in LL(1) grammar G’ L → EL’
L’ → EL’ | ε
E → (E’ |V |T
E’ → C) | F)
C → if EE C’
C’ → E | ε
F → +L|−L|∗L|printL V → a|b|c|d
T → 0|1|2|3
First Follow
a bcd0123(
a bcd0123(
ε $) (
a bcd
4 LL(1) parse table
Rule
L → EL’ L’ → EL’ L’ → ε
E → (E’ E→ V
E→ T 0 1 2 3
E’ → C) if
E’ → F) + – * print C→ifEEC’ if
C’ → E a b c d 0 1 2 3 ( C’→εε
F → +L +
F → -L –
F → *L *
F → print L print
V→a a
V→b b
V→ c c
V→d d
T→0 0
T→1 1
T→2 2
T→3 3
)
Parse Table
( ) if
L EL’
L’ EL’ ε
E (E’
E’ C)
+ – * print
F) F) F) F)
+L -L *L print L
a b c d 0 1 2 3 $
EL’ EL’ EL’ EL’ EL’ EL’ EL’ EL’ EL’ EL’ EL’ EL’ EL’ EL’ EL’ EL’ ε V V V V T T T T
E E E E E E E E
C
C’ E ε F
if EE C’
V
T 0123
5 Implementation
Test Example 1
Input
abcd
(if (-1 a) (print 1))
Output
(-1a)(print1))$
(-1a)(print1))$
-1a)(print1))$
-1a)(print1))$
-1a)(print1))$
1a)(print1))$
1a)(print1))$
1a)(print1))$
1a)(print1))$
a)(print1))$
a)(print1))$
a)(print1))$
a)(print1))$
)(print1))$
)(print1))$
(print1))$
(print1))$
print1))$
print1))$
L$
EL’$
(E’L’$
E’L’$
(if(-1a)(print1))$
(if(-1a)(print1))$
(if(-1a)(print1))$
if(-1a)(print1))$
if(-1a)(print1))$
if(-1a)(print1))$
ACCEPTED
C)L’$
ifEEC’)L’$
EEC’)L’$
(E’EC’)L’$
E’EC’)L’$
F)EC’)L’$
-L)EC’)L’$
L)EC’)L’$
EL’)EC’)L’$
TL’)EC’)L’$
1L’)EC’)L’$
L’)EC’)L’$
EL’)EC’)L’$
VL’)EC’)L’$
aL’)EC’)L’$
L’)EC’)L’$
)EC’)L’$
EC’)L’$
(E’C’)L’$
E’C’)L’$
F)C’)L’$
print1))$ printL)C’)L’$
1))$
1))$
1))$
1))$
Test Example 2
Input
(print (+ 1 (print 2)) )
output
))$ ))$ )$ )$ $
L)C’)L’$
EL’)C’)L’$
TL’)C’)L’$
1L’)C’)L’$
L’)C’)L’$ )C’)L’$ C’)L’$ )L’$ L’$ $$
ACCEPTED
L$
EL’$
(E’L’$
E’L’$
F)L’$
printL)L’$
L)L’$
EL’)L’$
(E’L’)L’$
E’L’)L’$
F)L’)L’$
+L)L’)L’$
L)L’)L’$
EL’)L’)L’$
TL’)L’)L’$
1L’)L’)L’$
L’)L’)L’$
EL’)L’)L’$
(E’L’)L’)L’$
E’L’)L’)L’$
F)L’)L’)L’$
print2)))$ printL)L’)L’)L’$
(print(+1(print2)))$
(print(+1(print2)))$
(print(+1(print2)))$
print(+1(print2)))$
print(+1(print2)))$
print(+1(print2)))$
(+1(print2)))$
(+1(print2)))$
(+1(print2)))$
+1(print2)))$
+1(print2)))$
+1(print2)))$
1(print2)))$
1(print2)))$
1(print2)))$
1(print2)))$
(print2)))$
(print2)))$
(print2)))$
print2)))$
print2)))$
Test Example 3
Input
(print (+ 1 (print 2)) )
Output
(print(+1(print2))$
(print(+1(print2))$
(print(+1(print2))$
print(+1(print2))$
print(+1(print2))$
print(+1(print2))$
(+1(print2))$
L$
EL’$
(E’L’$
E’L’$
F)L’$
printL)L’$
L)L’$
2)))$
2)))$
2)))$
2)))$
)))$
)))$
))$
))$
)$
)$
$
L)L’)L’)L’$
EL’)L’)L’)L’$
TL’)L’)L’)L’$
2L’)L’)L’)L’$
L’)L’)L’)L’$ )L’)L’)L’$ L’)L’)L’$ )L’)L’$ L’)L’$ )L’$ L’$ $$
REJECTED
6 Extension
EL’)L’$
(E’L’)L’$
E’L’)L’$
F)L’)L’$
+L)L’)L’$
L)L’)L’$
EL’)L’)L’$
TL’)L’)L’$
1L’)L’)L’$
L’)L’)L’$
EL’)L’)L’$
(E’L’)L’)L’$
E’L’)L’)L’$
F)L’)L’)L’$
print2))$ printL)L’)L’)L’$
(+1(print2))$
(+1(print2))$
+1(print2))$
+1(print2))$
+1(print2))$
1(print2))$
1(print2))$
1(print2))$
1(print2))$
(print2))$
(print2))$
(print2))$
print2))$
print2))$
2))$
2))$
2))$
2))$
))$
))$
)$
)$
$
$
L)L’)L’)L’$
EL’)L’)L’)L’$
TL’)L’)L’)L’$
2L’)L’)L’)L’$
L’)L’)L’)L’$
)L’)L’)L’$
L’)L’)L’$
)L’)L’$
L’)L’$
)L’$
I choose a) Use the FIRST and FOLLOW sets to implement an error recovery feature.
Method
When there is no find entry in the parse table for the current top stack variable and the current terminal in the string, we can determine which terminals are expected through the first and follow set of the current top stack variable.
The expected terminals for variable X is the first set of variable X plus the follow set of variable X if ε in the first set of variable X. For example the expected terminals for L is a b c d 0 1 2 3 ( and the exepected terminals for L’ is a b c d 0 1 2 3 ( ).
Usage
When the parser outputs message for user to delete. The user should input y or n. When the parser prompt message for user to add, the user should add one terminal.
Test Examples Example 1
(if (-1 a) (print 1) 2 0)
(if(-1a)(print1)20)$
(if(-1a)(print1)20)$
(if(-1a)(print1)20)$
if(-1a)(print1)20)$
if(-1a)(print1)20)$
if(-1a)(print1)20)$
(-1a)(print1)20)$
(-1a)(print1)20)$
-1a)(print1)20)$
-1a)(print1)20)$
-1a)(print1)20)$
1a)(print1)20)$
1a)(print1)20)$
1a)(print1)20)$
1a)(print1)20)$
a)(print1)20)$
a)(print1)20)$
a)(print1)20)$
a)(print1)20)$
)(print1)20)$
)(print1)20)$
(print1)20)$
(print1)20)$
print1)20)$
print1)20)$
print1)20)$
1)20)$
1)20)$
1)20)$
1)20)$
)20)$
)20)$
20)$
20)$
20)$
20)$
0)$
L$
EL’$
(E’L’$
E’L’$
C)L’$
ifEEC’)L’$
EEC’)L’$
(E’EC’)L’$
E’EC’)L’$
F)EC’)L’$
-L)EC’)L’$
L)EC’)L’$
EL’)EC’)L’$
TL’)EC’)L’$
1L’)EC’)L’$
L’)EC’)L’$
EL’)EC’)L’$
VL’)EC’)L’$
aL’)EC’)L’$
L’)EC’)L’$
)EC’)L’$
EC’)L’$
(E’C’)L’$
E’C’)L’$
F)C’)L’$
printL)C’)L’$
L)C’)L’$
EL’)C’)L’$
TL’)C’)L’$
1L’)C’)L’$
L’)C’)L’$
)C’)L’$
C’)L’$
E)L’$
T)L’$
2)L’$
)L’$
Error: got 0, but expected [)]
Delete input? (y/n): y
ACCEPTED
)$ $
)L’$ L’$ $$
Example 2
(print (+ 1 (print 2)
(print(+1(print2)$
(print(+1(print2)$
(print(+1(print2)$
print(+1(print2)$
print(+1(print2)$
print(+1(print2)$
L$
EL’$
(E’L’$
E’L’$
F)L’$ printL)L’$ L)L’$ EL’)L’$ (E’L’)L’$ E’L’)L’$ F)L’)L’$ +L)L’)L’$ L)L’)L’$ EL’)L’)L’$ TL’)L’)L’$ 1L’)L’)L’$ L’)L’)L’$ EL’)L’)L’$ (E’L’)L’)L’$ E’L’)L’)L’$ F)L’)L’)L’$ print2)$ printL)L’)L’)L’$ 2)$ L)L’)L’)L’$ 2)$ EL’)L’)L’)L’$ 2)$ TL’)L’)L’)L’$ 2)$ 2L’)L’)L’)L’$
(+1(print2)$
(+1(print2)$
(+1(print2)$
+1(print2)$
+1(print2)$
+1(print2)$
1(print2)$
1(print2)$
1(print2)$
1(print2)$
(print2)$
(print2)$
(print2)$
print2)$
print2)$
)$ )$ $ $
L’)L’)L’)L’$
)L’)L’)L’$
L’)L’)L’$
)L’)L’$
Error: got $, but expected [)]
Add input? )
)$ $ $
)L’)L’$
L’)L’$
)L’$
Error: got $, but expected [)]
Add input? )
ACCEPTED
Example 3
)$ )L’$ $ L’$ $$
(print ( (+ 1 (print 2)))
(print((+1(print2)))$ L$
(print((+1(print2)))$ EL’$
(print((+1(print2)))$
print((+1(print2)))$
print((+1(print2)))$
print((+1(print2)))$
((+1(print2)))$
((+1(print2)))$
((+1(print2)))$
(E’L’$
E’L’$
F)L’$
printL)L’$
L)L’$
EL’)L’$
(E’L’)L’$
E’L’)L’$
(+1(print2)))$
Error: got (, but expected [+, -, *, print, if] Add input? +
E’L’)L’$
F)L’)L’$
+L)L’)L’$
L)L’)L’$
EL’)L’)L’$
(E’L’)L’)L’$
E’L’)L’)L’$
F)L’)L’)L’$
+L)L’)L’)L’$
L)L’)L’)L’$
EL’)L’)L’)L’$
TL’)L’)L’)L’$
1L’)L’)L’)L’$
L’)L’)L’)L’$
EL’)L’)L’)L’$
(E’L’)L’)L’)L’$
E’L’)L’)L’)L’$
F)L’)L’)L’)L’$
print2)))$ printL)L’)L’)L’)L’$
2)))$ L)L’)L’)L’)L’$
2)))$ EL’)L’)L’)L’)L’$
2)))$ TL’)L’)L’)L’)L’$
2)))$ 2L’)L’)L’)L’)L’$
+(+1(print2)))$
+(+1(print2)))$
+(+1(print2)))$
(+1(print2)))$
(+1(print2)))$
(+1(print2)))$
+1(print2)))$
+1(print2)))$
+1(print2)))$
1(print2)))$
1(print2)))$
1(print2)))$
1(print2)))$
(print2)))$
(print2)))$
(print2)))$
print2)))$
print2)))$
Error: got $, but expected [)]
Add input? )
ACCEPTED
)))$
)))$
))$
))$
)$
)$
$
$
L’)L’)L’)L’)L’$
)L’)L’)L’)L’$
L’)L’)L’)L’$
)L’)L’)L’$
L’)L’)L’$
)L’)L’$
L’)L’$
)L’$
)L’$ L’$ $$
)$ $