mirror of
https://github.com/ProgramSnail/Lama.git
synced 2025-12-05 22:38:44 +00:00
78 lines
5 KiB
TeX
78 lines
5 KiB
TeX
\section{Abstract Syntax}
|
|
|
|
Abstract syntax defines the shapes of \emph{abstract syntax trees} (AST). We give the formation rules in a \emph{mixfix} form to
|
|
reflect the concrete syntax (presented in Section~\ref{sec:concrete_syntax}); however, the intended meaning is \emph{prefix},
|
|
thus the formation rule for, for example, conditional expression
|
|
|
|
\[
|
|
\mbox{\llang{if $\;\mathscr E\;$ then $\;\mathscr E\;$ else $\;\mathscr E$}}
|
|
\]
|
|
|
|
defines the following AST fragment:
|
|
|
|
\[
|
|
\mbox{\llang{if$\,(\mathscr E,\,\mathscr E,\,\mathscr E)$}}
|
|
\]
|
|
|
|
The root syntactic category for the language is \emph{compilation unit} $\mathscr U$, which is an expression in a contexts of
|
|
a group of top-level \emph{definitions} $\mathscr D$:
|
|
|
|
\[
|
|
\begin{array}{rcll}
|
|
\mathscr S & :: & \mathscr D^*\quad \mathscr E & \mbox{--- scope expression}\\
|
|
\mathscr D & :: & \mbox{\lstinline|var $\;\mathscr X$|} & \mbox{--- local variable definition} \\
|
|
& & \mbox{\lstinline|fun $\;\mathscr X\;$ ($\mathscr X^*$) \{$\;\mathscr S\;$\}|} & \mbox{--- function definition}\\
|
|
\mathscr U & :: & \mathscr S & \mbox{--- compilation unit}
|
|
\end{array}
|
|
\]
|
|
|
|
The core syntactic category for the language is \emph{expressions} $\mathscr E$. The following kinds of
|
|
expressions are distinguished:
|
|
|
|
\[
|
|
\begin{array}{rcll}
|
|
\mathscr E & :: & \mathscr X & \mbox{--- variable} \\
|
|
& & \mathbb N & \mbox{--- constant} \\
|
|
& & \lstinline|{ $\mathscr S\;$ }| & \mbox{--- nested scope} \\
|
|
& & \mathscr E \otimes \mathscr E & \mbox{--- binary expression} \\
|
|
& & \mathscr E\;\lstinline|($\mathscr E^*$)| & \mbox{--- call} \\
|
|
& & \llang{fun ($\mathscr X^*$) \{$\mathscr S$\}} & \mbox{--- lambda expression} \\
|
|
& & \llang{[$\mathscr E^*$]} & \mbox{--- array} \\
|
|
& & \llang{$\mathscr E\;$ [$\mathscr E$]} & \mbox{--- array element} \\
|
|
& & \llang{$\mathscr T\;$ ($\mathscr E^*$)} & \mbox{--- S-expression} \\
|
|
& & \mathscr E \;\mbox{\lstinline|:=|} \;\mathscr E & \mbox{--- assignment} \\
|
|
& & \mathscr E \mbox{\lstinline|;|}\; \mathscr E & \mbox{--- sequential expression} \\
|
|
& & \llang{if $\;\mathscr E\;$ then $\;\mathscr E\;$ else $\;\mathscr E$} & \mbox{--- conditional expression} \\
|
|
& & \llang{while $\;\mathscr E\;$ do $\;\mathscr E$} & \mbox{--- loop expression} \\
|
|
& & \llang{case $\;\mathscr E\;$ ($\mathscr P$ -> $\mathscr E$)$^+$} & \mbox{--- pattern matching} \\
|
|
& & \mbox{\lstinline|skip|} & \mbox{--- empty expression} \\
|
|
& & \bot & \mbox{--- default value} \\
|
|
& & \llang{ref ($\mathscr X$)} & \mbox{--- reference to variable} \\
|
|
& & \llang{elemRef ($\mathscr E$,$\;\mathscr E$)} & \mbox{--- reference to array element} \\
|
|
& & \llang{ignore ($\mathscr E$)} & \mbox{--- ignore expression}
|
|
\end{array}
|
|
\]
|
|
|
|
Note, in the formation rule for binary expressions the symbol ``$\otimes$'' is left undefined. The actual assortment of
|
|
binary operators is given in Section~\ref{sec:expressions}.
|
|
|
|
The last four kinds of expressions (``$\bot$'', \llang{ref}, \llang{elemRef} and \llang{ignore}) are \emph{internal} in the sense that
|
|
they are not represented explicitly in the concrete syntax; instead, they are \emph{inferred} using the attribute system described
|
|
in Section~\ref{sec:wellformedness}.
|
|
|
|
The last category is \emph{patterns} $\mathscr P$. Patterns are used in \lstinline|case|-expressions to match the values against:
|
|
|
|
\[
|
|
\begin{array}{rcll}
|
|
\mathscr P & :: & \_ & \mbox{--- wildcard} \\
|
|
& & \mathbb N & \mbox{--- constant} \\
|
|
& & \llang{[$\mathcal P^*$]} & \mbox{--- array}\\
|
|
& & \llang{$\mathcal T\;$($\mathcal P^*$)} & \mbox{--- S-expression}\\
|
|
& & \llang{array} & \mbox{--- array type}\\
|
|
& & \llang{sexp} & \mbox{--- S-expression type}\\
|
|
& & \llang{fun} & \mbox{--- closure type}\\
|
|
& & \llang{val} & \mbox{--- value type}\\
|
|
& & \llang{box} & \mbox{--- reference type}
|
|
\end{array}
|
|
\]
|
|
|