Homework #4

Compiler Construction, WS0910

Homework #4 (due Nov. 27th, see last entry!) requires you to implement the following:

  • extend the parser to handle if, else, and while statements. The new grammar rules are:
    ifStat ::= 'if' condExpr '{' block '}' ('else' '{' block '}')?
    whileStat ::= 'while' condExpr '{' block '}'
    condExpr ::= expr (bop expr)?
    bop ::= '<' | '>' | '==' | ...

    A conditional expression (condExpr) is true if its value is > 0, and false otherwise.

  • parse function declarations:
    funcDecl ::= name '(' paramDeclList ')' '{' block '}'
    paramDeclList ::= name*

    Extend your symbol table to be able to store a function declaration.

  • interpret function calls:
    factor ::= number | name | name '(' expr* ')'

    Make sure to handle parameter symbols correctly when calling functions. It should be possible to access globals from a function, but you may choose to make function execution free of side effects. Please make a comment or two about how your implementation works in the code!

Please remember to write simple test cases first (if without else, functions without parameters…). Develop iteratively, adding features as you go. Do not attempt to get everything right on first attempt…