\section{The Abstract Syntax Tree} \label{sec:ast} In functional programming languages it is trivial to create new types. A formally defined syntax as we have seen for While in \autoref{sec:intro:while} translates almost directly to a type definition: \lstinputlisting[firstline=12,lastline=24]{While/WhileCommon.dcl} \lstinputlisting[firstline=6,lastline=10]{While/Simple.dcl} Note that we have added common binary operators like \CI{Lt} that did not exist in the grammar of \autoref{sec:intro:while}. These operators could also be constructed from other boolean expressions. We have also added \CI{Div} for integer division. It is a useful addition in this example, as it will force us to implement error handling in the evaluation of arithmetic expressions when we divide by zero. As an example, the example program from \autoref{sec:intro:while} would be stored in the AST as follows: \begin{lstlisting} Compose (Ass "x" (Var "y")) (While (Not (Comp (Var "x") Le (Lit 0))) (Compose (Ass "x" (Op (Var "x") Sub (Lit 2))) (Ass "y" (Op (Var "y") Sub (Lit 1))) ) ) \end{lstlisting}