\begin{figure} \fbox{ $\begin{array}{lrcll} %\mbox{Program} & prog & \rightarrow & binds & \\ %\\ \mbox{Bindings} & binds & \rightarrow & bind_1 @;@ \ldots @;@~ bind_n & n \geq 1 \\ & bind & \rightarrow & var ~@=@~ vars_f ~@\@ upd~ vars_a ~@->@~expr & \mbox{Closure} \\ &&&& (vars_f = \freevars{expr} \setminus vars_a) \\ \\ \mbox{Update flag} & upd & \rightarrow & @u@ & \mbox{Updatable} \\ && | & @n@ & \mbox{Not updatable} \\ \\ \mbox{Expression} & expr & \rightarrow & @let@~binds~@in@~ expr & \mbox{Local definition} \\ && | & @letrec@~binds~@in@~expr & \mbox{Local recursive definition} \\ && | & @case@~expr~@of@~alts & \mbox{Case expression} \\ && | & var~vars & \mbox{Application}\\ && | & con~vars & \mbox{Saturated constructor} \\ && | & prim~vars & \mbox{Saturated primitive} \\ && | & literal & \\ \\ \mbox{Alternatives} & alts & \rightarrow & calt_1@;@ \ldots @;@~calt_n@; default ->@~ expr & n \geq 0~\mbox{(Boxed)} \\ && | & lalt_1@;@ \ldots @;@~lalt_n@;@~var ~@->@~ expr & n \geq 0~\mbox{(Unboxed)} \\ \\ \mbox{Constructor alt} & calt & \rightarrow & con~vars~@->@~expr & \\ \mbox{Literal alt} & lalt & \rightarrow & literal~@->@~expr & \\ \\ \mbox{Literals} & literal & \rightarrow & integer & \\ && | & \ldots & \\ \\ \mbox{Primitives} & prim & \rightarrow & @+@ ~|~ @-@ ~|~ @*@ ~|~ @/@ \\ && | & \ldots & \\ \\ \mbox{Variable lists} & vars & \rightarrow & @[@var_1@,@ \ldots @,@~var_n@]@ & n \geq 0 \\ \\ \end{array}$ } \caption{Syntax of the STG language} \label{fig:stg-syntax} \end{figure}