Programming Language Principles Solution to Homework for Week 02. 1. a) Nonterminal B is left recursive, hence the grammar is not LL(1). b) Modified grammar: S -> k Z Z -> B Z -> B -> A x Y Y -> x Y -> A -> v Q Q -> S k -> c) LL(1) Parse Table: Stack Top x k v +---------------------------------------------------+------------+ | S | | S -> k X | | | +------------+------------+------------+------------+------------+ | Z | | Z -> | Z -> B Z | Z -> | +------------+------------+------------+------------+------------+ | Y | Y -> x Y | Y -> | Y -> | Y -> | +------------+------------+------------+------------+------------+ | Q | Q -> | Q -> S k | | | +------------+------------+------------+------------+------------+ | A | | | A -> v Q | | +------------+------------+------------+------------+------------+ | B | | | B -> A x Y | | +------------+------------+------------+------------+------------+ d) Stack Input OPF ----------------------------------------------------------- S kvxvkkxx S->kZ kZ kvxvkkxx Z vxvkkxx Z->BZ BZ vxvkkxx B->AxY AxYZ vxvkkxx A->vQ vZxYZ vxvkkxx ZxYZ xvkkxx Q-> xYZ xvkkxx YZ vkkxx Y-> Z vkkxx Z->BZ BZ vkkxx B->AxY AxYZ vkkxx A->vQ vQxYZ vkkxx QxYZ kkxx Q->Sk SkxYZ kkxx S->kZ yZkxYZ kkxx XkxYZ kxx Z-> kxYZ kxx xYZ xx YZ x Y->xY xYZ x YZ Y-> Z Z-> --- --- Derivation of input: S => kZ using S->yZ => kBZ using Z->BZ => kAxYZ using B->AxY => kvQxYZ using A->vQ => kvxYz using Q-> => kvxZ using Y-> => kvxBZ using Z->BZ => kvxAxYZ using B->AxY => kvxvQxYZ using A->vQ => kvxvSkxYZ using Q->Sy => kvxvkXkxYZ using S->yX => kvxvkkxYZ using Z-> => kvxvkkxxYZ using Y->xY => kvxvkkxxZ using Y-> => kvxvkkxx using Z-> => kvxvkkxx e) Skeleton of recursive descent parser: procedure S; begin Read(T_k); Z; end; procedure Z; begin if Next_Token = T_v then begin B; Z end; end; procedure B; begin A; Read(T_x); Y end; procedure Y; begin if Next_Token = T_x then begin Read(T_x); Y end; end; procedure A; begin Read(T_v); Q end; procedure Q; begin if Next_Token = k then begin S; Read(T_k); end; end; begin { main } S end; f) Code with output statements added: procedure S; begin Read(T_k); Write(S -> k); while Next_Token = T_v do begin B; Write(S -> S B) end end; procedure B; begin A; Read(T_x); Write(B -> A x); while Next_Token = T_x do begin Read(T_x); Write(B -> B x) end end; procedure A; begin read(T_v); if Next_Token = T_k then begin S; Read(T_k); Write (A -> v S k) end else Write(A -> v) end; begin { main } S end;