\subsection{IMP Language} \subsubsection{The syntax} The allowed characters: \begin{code}{haskell} Letter = 'A' | . . . | 'Z' | 'a' | . . . | 'z' Digit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' \end{code} And the allowed tokens: \begin{code}{haskell} Ident = Letter { Letter | Digit }* Numeral = Digit | Numeral Digit Var = Ident \end{code} Arithmetic and Boolean statements could be defined in Haskell as follows \begin{code}{haskell} data Aexp = Bin Op Aexp Aexp | Var String | Num Integer data Op = Add | Sub | Mul data Bexp = Or Bexp Bexp | And Bexp Bexp | Not Bexp | Rel Rop Aexp Aexp data Rop = Eq | Neq | Le | Leq | Ge | Geq \end{code} Statements could be defined in Haskell as follows \mint{haskell}+data Stm = Skip | Assign String Aexp | Seq Stm Stm | If Bexp Stm Stm | While Bexp Stm+ We use the following naming conventions for meta-variables: \begin{tables}{ll}{Variable & Type} $n$ & for numerals (\texttt{Numeral}) \\ $x, y, z$ & for variables (\texttt{Var}) \\ $e, e', e_1, e_2$ & for arithmetic expressions (\texttt{Aexp}) \\ $b, b_1, b_2$ & for boolean expressions (\texttt{Bexp}) \\ $s, s', s_1, s_2$ & for Statements (\texttt{Stm}) \\ \end{tables} Meta-variables stand for arbitrary program variables, whereas program variables are concrete variables in a program. To denote \bi{syntactic equality} of two variables or statements, we use $\equiv$