X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/68a620ab55d7a8f5ba26a53ff2a0ba491cc2d25c..1ad4b33a5c4b390d728ef15c0eb85e53b0383c50:/doc/syntax.tex?ds=sidebyside diff --git a/doc/syntax.tex b/doc/syntax.tex index aff02ab..35ab100 100644 --- a/doc/syntax.tex +++ b/doc/syntax.tex @@ -58,7 +58,7 @@ enough that they deserve special notation. \syntax{$x^*$ ::= $[x]$ ::= $\epsilon$ @! $[x]$ $x$} \end{quote} -\item $x^+$ abbreviates @$[x]$, denoting a sequence of zero or +\item $x^+$ abbreviates @$[x]$, denoting a sequence of one or more occurrences of $x$: \begin{quote} \syntax{$x^+$ ::= $[x]$ ::= $[x]$ $x$} @@ -196,16 +196,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} @@ -353,12 +353,14 @@ declarations instead. \begin{grammar} ::= - "code" ":" @[@] + "code" ":" @[@] "{" "}" ::= "[" $[\mbox{@}]$ "]" - ::= @^+ + ::= @^+ + + ::= @! "(" @^+ ")" \end{grammar} The @ will be output unchanged to one of the output files. @@ -367,18 +369,19 @@ The first @ is the symbolic name of an output file. Predefined output file names are @"c" and @"h", which are the implementation code and header file respectively; other output files can be defined by extensions. -The second @ provides a name for the output item. Several C -fragments can have the same name: they will be concatenated together in the -order in which they were encountered. +Output items are named with a sequence of identifiers, separated by +whitespace, and enclosed in parentheses. As an abbreviation, a name +consisting of a single identifier may be written as just that identifier, +without the parentheses. The @ provide a means for specifying where in the output file the output item should appear. (Note the two kinds of square brackets shown in the syntax: square brackets must appear around the constraints if they are present, but that they may be omitted.) Each comma-separated @ -is a sequence of identifiers naming output items, and indicates that the -output items must appear in the order given -- though the translator is free -to insert additional items in between them. (The particular output items -needn't be defined already -- indeed, they needn't be defined ever.) +is a sequence of names of output items, and indicates that the output items +must appear in the order given -- though the translator is free to insert +additional items in between them. (The particular output items needn't be +defined already -- indeed, they needn't be defined ever.) There is a predefined output item @"includes" in both the @"c" and @"h" output files which is a suitable place for inserting @"\#include" @@ -404,14 +407,15 @@ though the only operators currently defined act on integer values only. \subsubsection{The expression evaluator} \begin{grammar} - ::= | "+" | "-" + ::= | "+" | "--" ::= | "*" | "/" - ::= | "+" | "-" + ::= | "+" | "--" ::= | | | +\alt "<" ">" \alt "?" \alt "(" ")" \end{grammar} @@ -448,8 +452,21 @@ recognized. \alt "bool" | "_Bool" \alt "imaginary" | "_Imaginary" | "complex" | "_Complex" \alt +\alt +\alt + + ::= | "const" | "volatile" | "restrict" + + ::= @^+ + + ::= + "(" ")" - ::= "const" | "volatile" | "restrict" + ::= "atomic" | "_Atomic" + + ::= "(" ")" + + ::= "alignas" "_Alignas" ::= \end{grammar} @@ -466,9 +483,11 @@ defined in the built-in module. Declaration specifiers may appear in any order. However, not all combinations are permitted. A declaration specifier must consist of zero or -more @, and one of the following, up to reordering. +more @s, zero or more @s, and one of the +following, up to reordering. \begin{itemize} \item @ +\item @ \item @"struct" @, @"union" @, @"enum" @ \item @"void" \item @"_Bool", @"bool" @@ -490,27 +509,31 @@ All of these have their usual C meanings. \subsubsection{Declarators} \begin{grammar} -$[k]$ ::= @^* $[k]$ +$[k, a]$ ::= @^* $[k, a]$ -$[k]$ ::= $k$ -\alt "(" $[k]$ ")" -\alt $[k]$ @ +$[k, a]$ ::= $k$ +\alt "(" $[k, a]$ ")" +\alt $[k, a]$ @$[a]$ ::= "*" @^* - ::= "[" "]" -\alt "(" ")" +$[a]$ ::= "[" "]" +\alt "(" $a$ ")" - ::= $\epsilon$ | "..." -\alt $[\mbox{@}]$ @["," "..."@] + ::= $\epsilon$ | "\dots" +\alt $[\mbox{@}]$ @["," "\dots"@] ::= @^+ + ::= $[\epsilon, \mbox{@}]$ + ::= $[\mbox{@ @! $\epsilon$}]$ - ::= $[\mbox{@}]$ + ::= + $[\mbox{@ @! $\epsilon$}, \mbox{@}]$ - ::= "." + ::= + $[\mbox{@}, \mbox{@}]$ \end{grammar} The declarator syntax is taken from C, but with some differences. @@ -525,6 +548,24 @@ The declarator syntax is taken from C, but with some differences. The remaining differences are (I hope) a matter of presentation rather than substance. +There is additional syntax to support messages and methods which accept +keyword arguments. + +\begin{grammar} + ::= @["=" @] + + ::= + @[$[\mbox{@}]$@] + "?" @[$[\mbox{@}]$@] + + ::= @! + + ::= "." + +$[k]$ ::= + $[k, \mbox{@}]$ +\end{grammar} + \subsection{Class definitions} \label{sec:syntax.module.class} @@ -541,17 +582,17 @@ substance. 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} @@ -564,6 +605,8 @@ class Sub : Super { ::= \alt +\alt +\alt \alt \alt \end{grammar} @@ -577,7 +620,10 @@ names, to distinguish them from other kinds of identifiers. The @$[\mbox{@}]$ names the direct superclasses for the new class. It is an error if any of these @s does not name a defined -class. +class. The superclass list is required, and must not be empty; listing +@|SodObject| as your class's superclass is a good choice if nothing else +seems suitable. It's not possible to define a \emph{root class} in the Sod +language: you must use Lisp to do this, and it's quite involved. The @ provide additional information. The standard class properties are as follows. @@ -622,28 +668,28 @@ 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} ::= @["class"@] $[\mbox{@}]$ ";" - ::= "=" + ::= @["=" @] - :: "{" "}" | + :: \end{grammar} An @ provides an initial value for one or more slots. If @@ -654,15 +700,28 @@ The first component of the @ must be the nickname of one of the class's superclasses (including itself); the second must be the name of a slot defined in that superclass. -The initializer has one of two forms. -\begin{itemize} -\item A @ enclosed in braces denotes an aggregate initializer. - This is suitable for initializing structure, union or array slots. -\item A @ \emph{not} beginning with an open brace is a `bare' - initializer, and continues until the next @`,' or @`;' which is not within - nested brackets. Bare initializers are suitable for initializing scalar - slots, such as pointers or integers, and strings. -\end{itemize} +An @|initarg| property may be set on an instance slot initializer (or a +direct slot definition). See \xref{sec:concepts.lifecycle.birth} for the +details. An initializer item must have either an @|initarg| property, or an +initializer expression, or both. + +Each class may define at most one initializer item with an explicit +initializer expression for a given slot. + +\subsubsection{Initarg items} +\begin{grammar} + ::= + "initarg" + @^+ + $[\mbox{@}]$ ";" +\end{grammar} + +\subsubsection{Fragment items} +\begin{grammar} + ::= "{" "}" + + ::= "init" | "teardown" +\end{grammar} \subsubsection{Message items} \begin{grammar}