1. Lexical Analysis phase Syntax Analysis Phase, Semantic Analysis Phase, 2. a. (0|1)*00 b. Initial state: S0 Transitions: From To Symbol S0 S0 0 S0 S0 1 S0 S1 0 S1 S2 0 Final state: S2 Or (refer to textbook): Initial State: S0 From To Symbol S0 S1 e(Epsilon) S1 S2 e S2 S3 0 S3 S6 e S1 S4 e S4 S5 1 S5 S6 e S6 S1 e S6 S7 e S0 S7 e S7 S8 0 S8 S9 0 Final State: S9 3. Solution 1 (does not take care of the first sentence): %{ char ucase(char); %} ws [ \t\n]* lc_letter [a-z] %% "."{ws}{lc_letter} {yytext[yyleng-1] = ucase(yytext[yyleng-1]); printf("%s", yytext);} .|\n { printf(%s, yytext);} %% ------------ Solution 2 (complete solution): %{ char ucase(char); %} %% [^ \t\n]([^.]*)"." { printf("%c", ucase(yytext[0])); printf("%s", yytext+1);} .|\n { printf(%s, yytext);} %% 4. a. First(S) = {a, e} b. Follow(S) = {a, $} c. It violates both two rules: i)First (aaSab) /\ First (abSaa) = {a} <> {} ii)Follow (S) /\ First (abSaa) = {a} <> {} Follow (S) /\ First (aaSab) = {a} <> {} 5. a. No. Consider an abstraction grammar, where i stands for if expr then, e stands for else, and a stands for "all other productions". We write augment grammar as following: S' -> S S -> iSeS | iS |a LR(0) set of item as following: I0: S' -> S I3: S -> a. S -> .iSeS S -> .iS I4: S -> iS.eS S -> .a S -> iS. I1: S' -> S I5: S -> iSe.S I2: S -> i.SeS S -> .iSeS S -> i.S S -> .iS S -> .iSes S -> .a S -> .iS S -> .a I6: S -> iSeS. There is a shift/reduce conflict in I4. There, S -> iS.eS calls for a shift of e and, since Follow(S) = {e,$}, item S -> iS. Calls for reduction by S -> iS on input e. b. Yes. If one rule doesn't match, the recursive descent parser will try anotherrule. 6. a. LR(0) set of items is as following: I0: E' ->.E E -> .E + E E -> .E * E E -> .id I1: goto(I0, E) E' -> E. E -> E. + E E -> E. * E I2: goto(I0, id) E -> id. I3: goto (I1, +) E -> E +. E E -> .E + E E -> .E * E E -> .id I4: goto(I1, *) E -> E *. E E -> .E + E E -> .E * E E -> .id I5: goto(I3, E) E -> E + E. E -> E.+ E E -> E. * E I6: goto(I4, E) E -> E * E. E -> E.+ E E -> E. * E b. SLR(1) action table is as following: id + * $ 0 s2 1 s3 s4 acc 2 r3 r3 r3 3 s2 4 s2 5 s3 s4 r1 r1 r1 6 s3 s4 r2 r2 r2 c. E -> id + E E -> id * E E -> id