========================================== CS240H Final Project - Historical Debugger ========================================== authors: Daniel Sommermann, Michael Gummelt For this project, we define a toy language to implement our debugger on. The BNF of the language is given below: f = fn(x1, .., xn) { s; [s;] } s = var = e return e returnif e, e e = c1 | ... | cn (constants) (e) x e1 + e2 e1 - e2 e1 * e2 e1 / e2 e1 == e2 !e1 e1 && e2 e1 || e2 e1 == e2 e1 < e2 e1 > e2 if e1 then e2 else e3 f(e1, ..., en) Every function must return a value (that is, have a return statement). Explicitly, there must always be some return statement that is executed. The function can return early through the use of a returnif(). If the first argument to returnif is non-zero, the second argument is evaluated and returned. The return keyword may only be used as the last statement in a function body. e interpreter. Also changed the semantics and grammar of the language (added assignment and return statements) There must be exactly one function called 'main' in every text file. The value of the return of main will be printed once it has been computed.