\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. As an example, the 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}