Exercise 3.1
<function> <id, 1> <(> <id, 2> <,> <id, 3> <:> <integer> <;>
<{> <const, "return the maximum of integer i and j"> <}>
<begin>
<if> <id, 2> <>> <id, 3> <then> <id, 1> <:> <=> <id, 2>
<else> <id, 1> <:> <=> <id, 3>
<end> <;>
Exercise 3.2
a(a|b)∗a
A String of a's and b's(b can be 0) that start and end with a.
a∗ba∗a∗ba∗
A String consists of exactly 3 bs and random number of a.
Exercise 3.3
select -> [S|s][E|e][L|l][E|e][C|c][T|t]
Exercise 3.4
A = {1, 2, 4, 10, 8, 5, 12}
B = {3, 12}
C = {9, 6, 11, 12}
D = {7, 12}
This DFA can be reduced as follow:
Exercise3.5
/o[z|o|/]∗o/
Exercise 4.1
Eliminate left recursions:
S→(L)|a
L→SL′
L′→,SL′|ℇ
The transition diagrams for the grammer:
S:
L:
- L’:
A recursive descent predictive parser:
void S() {
if (lookahead == '(') {
match('('); L(); match(')');
} else if (lookahead == 'a') {
match('a');
} else {
error();
}
}
void L() {
if (lookahead in First(S)) {
S();
L'();
} else error();
}
void L'() {
if (lookahead == ',') {
match(',');
S();
L'();
} else if (lookahead in Follow(L')) {
//do nothing
} else error();
}
The procedure call sequence for an input sentence (a,(a,a)) .
S()
match('(')
L()
S()
match('a')
L'()
match(',')
S()
match('(')
L()
S()
match('a')
L'()
match(',')
S()
match('a')
L'()
match(')')
L'()
match(')')