Csharpminor is a low-level imperative language structured in expressions,
statements, functions and programs. Expressions include
reading global or local variables, reading store locations,
arithmetic operations, function calls, and conditional expressions
(similar to e1 ? e2 : e3 in C).
Unlike in Cminor (the next intermediate language of the back-end),
Csharpminor local variables reside in memory, and their addresses can
be taken using Eaddrof expressions.

The variables can be either scalar variables
(whose type, size and signedness are given by a memory_chunk
or array variables (of the indicated sizes). The only operation
permitted on an array variable is taking its address.

Functions are composed of a signature, a list of parameter names
with associated memory chunks (parameters must be scalar), a list of
local variables with associated var_kind description, and a
statement representing the function body.