Description
I have provided a compiler for parenlet on github.
Your task is to modify my lexer, parser, and compiler to add conditionals to parenlet, a small language described below:
‹expr›: 
           NUMBER
           ID
           ( add1 ‹expr› )
           ( sub1 ‹expr› )
           ( let ( ID <expr> ) <expr> )
           ( ifnz <expr> <expr> <expr> )
Your parser should produce an abstract syntax as shown in Lecture 4 as well:
type expr =
  | Num of int64
  | Add1 of expr
  | Sub1 of expr
  | Id of string
  | Let of string * expr * expr
  | Ifnz of expr * expr * expr
Semantics
The ìfnz expression takes 3 expressions as arguemnts: the condition, the
then-expression and the else-expression. If the condition evaluates to a
non-zero value, execution should continue in the then-expression, otherwise, the
else-expression is evaluated. The ifnz is an expression, so it should return a
value, as determined by the condition and expressions.
Example code
There's sample code in github. To run it you will need menhir and dune installed. I used opam to install mine.
You can compile a sample parenlet program using:
$ dune build
$ dune exec ./compiler.exe test-parenlet/112.pl 
section .text
global our_code_starts_here
our_code_starts_here:
mov rax, 112
  ret
$ dune exec ./compiler.exe test-parenlet/let.pl 
section .text
global our_code_starts_here
our_code_starts_here:
mov rax, 23
mov [rsp + 8*-1], rax
mov rax, [rsp + 8*-1]
  ret
After modifying the lexer, parser, and compiler you should be able to parse a program like the tests in test-ifnz
(ifnz 5 6 42)
(ifnz (add1 0) 6 7)
(let (x (ifnz 10 11 12)) (ifnz x (add1 x) (sub1 x)))
Deliverables
You should turn in your modified lexer.mll, parser.mly, compiler.ml and
syntax.ml. You shouldn't need to make changes to other files (really).
If you want, run dune clean and zip up your entire parenlet directory.