| Implement codegenTask2for the part of the language in black. No need to implement code
generation for the red parts.  No test for this task will feature
programs containing language constructs in red.  Your code generator
can throwCodegenExceptionfor the ASTs that correspond
to language constructs in red, or you can return RISC-V code, it does
not matter. 
PROG → DEC | DEC; PROG 
DEC → def ID (VARDEC) = E
VARDEC →  ε | VARDECNE 
VARDECNE → ID | VARDECNE, ID 
ID → ... (identifiers)
INT → ... (Integers)
E →  INT 
  | ID 
  | if E COMP E then E else E endif
  | (E BINOP E)
  | (E)
  | skip
  | (E; E)
  | while E COMP E do E endwhile
  | repeat E until E COMP E endrepeat
  | ID := E
  | ID(ARGS)
  | break
  | continue
ARGS → ε | ARGSNE
ARGSNE → E | ARGSNE, E
COMP → == | < | > | <= | >= 
BINOP → + | - | *  | / 
 Recall that the relevant definitions are
  here, here
    and here (and in the Zip file /
  Github given on the parent page).
  If you don't want to implement a feature, simply throw CodegenExceptionwhen the code generator encounters this feature. 
  Assignment, as well as
  commands while,repeatandskipcan return whatever they want, it's not
  specified. No test will depend on the return value of such
  commands. Sequential composition(E; E')returns
  whatever its second command returns. 
  Note that if,whileandrepeatconstructs all carry out comparisons. I
  suggest to factor the translation of comparisons into a separate
  method to avoid code duplication. |