X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/8d952432c8b961e4e0891eb78620615a8ae14f05..7292d6e1bc85cca454f64353722ba78a9263f257:/doc/syntax.tex?ds=sidebyside diff --git a/doc/syntax.tex b/doc/syntax.tex index 64b10f4..18b46e1 100644 --- a/doc/syntax.tex +++ b/doc/syntax.tex @@ -26,51 +26,6 @@ \chapter{Module syntax} \label{ch:syntax} %%%-------------------------------------------------------------------------- -\section{Notation} \label{sec:syntax.notation} - -Fortunately, Sod is syntactically quite simple. The notation is slightly -unusual in order to make the presentation shorter and easier to read. - -Anywhere a simple nonterminal name $x$ may appear in the grammar, an -\emph{indexed} nonterminal $x[a_1, \ldots, a_n]$ may also appear. On the -left-hand side of a production rule, the indices $a_1$, \ldots, $a_n$ are -variables which vary over all nonterminal and terminal symbols, and the -variables may also appear on the right-hand side in place of a nonterminal. -Such a rule stands for a family of rules, in each variable is replaced by -each possible simple nonterminal or terminal symbol. - -The letter $\epsilon$ denotes the empty nonterminal -\begin{quote} - \syntax{$\epsilon$ ::=} -\end{quote} - -The following indexed productions are used throughout the grammar, some often -enough that they deserve special notation. -\begin{itemize} -\item @[$x$@] abbreviates @$[x]$, denoting an optional occurrence - of $x$: - \begin{quote} - \syntax{@[$x$@] ::= $[x]$ ::= $\epsilon$ @! $x$} - \end{quote} -\item $x^*$ abbreviates @$[x]$, denoting a sequence of zero or - more occurrences of $x$: - \begin{quote} - \syntax{$x^*$ ::= $[x]$ ::= - $\epsilon$ @! $[x]$ $x$} - \end{quote} -\item $x^+$ abbreviates @$[x]$, denoting a sequence of one or - more occurrences of $x$: - \begin{quote} - \syntax{$x^+$ ::= $[x]$ ::= $[x]$ $x$} - \end{quote} -\item @$[x]$ denotes a sequence of one or more occurrences of $x$ - separated by commas: - \begin{quote} - \syntax{$[x]$ ::= $x$ @! $[x]$ "," $x$} - \end{quote} -\end{itemize} - -%%%-------------------------------------------------------------------------- \section{Lexical syntax} \label{sec:syntax.lex} Whitespace and comments are discarded. The remaining characters are @@ -196,16 +151,16 @@ binary. However, length and signedness indicators are not permitted. ::= any character other than "*" or "/" - ::= "//" @^* + ::= "/\,/" @^* ::= a newline character ::= any character other than newline \end{grammar} -Comments are exactly as in C99: both traditional block comments `\texttt{/*} -\dots\ \texttt{*/}' and \Cplusplus-style `\texttt{//} \dots' comments are -permitted and ignored. +Comments are exactly as in C99: both traditional block comments `@|/*| \dots\ +@|*/|' and \Cplusplus-style `@|/\,/| \dots' comments are permitted and +ignored. \subsection{Special nonterminals} \label{sec:syntax.lex.special} @@ -407,14 +362,15 @@ though the only operators currently defined act on integer values only. \subsubsection{The expression evaluator} \begin{grammar} - ::= | "+" | "-" + ::= | "+" | "--" ::= | "*" | "/" - ::= | "+" | "-" + ::= | "+" | "--" ::= | | | +\alt "<" ">" \alt "?" \alt "(" ")" \end{grammar} @@ -456,8 +412,10 @@ recognized. ::= | "const" | "volatile" | "restrict" + ::= @^+ + ::= - "(" @^+ ")" + "(" ")" ::= "atomic" | "_Atomic" @@ -517,14 +475,15 @@ All of these have their usual C meanings. $[a]$ ::= "[" "]" \alt "(" $a$ ")" - ::= $\epsilon$ | "..." -\alt $[\mbox{@}]$ @["," "..."@] + ::= $\epsilon$ | "\dots" +\alt $[\mbox{@}]$ @["," "\dots"@] ::= @^+ ::= $[\epsilon, \mbox{@}]$ ::= $[\mbox{@ @! $\epsilon$}]$ + ::= $[\mbox{@ @! $\epsilon$}, \mbox{@}]$ @@ -578,17 +537,17 @@ keyword arguments. A @ informs Sod that an @ will be used to name a class which is currently undefined. Forward declarations are necessary in order to resolve certain kinds of circularity. For example, -\begin{listing} -class Sub; +\begin{prog} +class Sub; \\+ -class Super : SodObject { - Sub *sub; -}; +class Super : SodObject \{ \\ \ind + Sub *sub; \-\\ +\}; \\+ -class Sub : Super { - /* ... */ -}; -\end{listing} +class Sub : Super \{ \\ \ind + /* \dots\ */ \-\\ +\}; +\end{prog} \subsubsection{Full class definitions} \begin{grammar} @@ -664,20 +623,20 @@ functions are fine. An @, if present, is treated as if a separate @ containing the slot name and initializer were present. For example, -\begin{listing} -[nick = eg] -class Example : Super { - int foo = 17; -}; -\end{listing} +\begin{prog} +[nick = eg] \\ +class Example : Super \{ \\ \ind + int foo = 17; \-\\ +\}; +\end{prog} means the same as -\begin{listing} -[nick = eg] -class Example : Super { - int foo; - eg.foo = 17; -}; -\end{listing} +\begin{prog} +[nick = eg] \\ +class Example : Super \{ \\ \ind + int foo; \\ + eg.foo = 17; \-\\ +\}; +\end{prog} \subsubsection{Initializer items} \begin{grammar}