X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/92e590b029e3cffc62b2876149ab257f0e6d8eb3..e895be217c3be6769708da17c9ae87cb22db040e:/doc/syntax.tex diff --git a/doc/syntax.tex b/doc/syntax.tex index 75aa36e..72329a4 100644 --- a/doc/syntax.tex +++ b/doc/syntax.tex @@ -51,15 +51,15 @@ could be a token. ::= | "_" - ::= @! + ::= | - ::= "A" | "B" | \dots\ | "Z" -\alt "a" | "b" | \dots\ | "z" -\alt + ::= "A" | "B" | $\cdots$ | "Z" + | "a" | "b" | $\cdots$ | "z" + | ::= "0" | - ::= "1" | "2" $| \ldots |$ "9" + ::= "1" | "2" | $\cdots$ | "9" \end{grammar} The precise definition of @ is left to the function @@ -80,11 +80,11 @@ level. ::= "'" "'" - ::= any character other than "\\" or "\"" -\alt "\\" + :: "\\" + | any character other than "\\" or "\"" - ::= any character other than "\\" or "'" -\alt "\\" + :: "\\" + | any character other than "\\" or "'" ::= any single character \end{grammar} @@ -101,25 +101,25 @@ discouraged. \begin{grammar} ::= -\alt -\alt -\alt + | + | + | ::= "0" | @^* - ::= "0" @("b"|"B"@) @^+ + ::= "0" @("b" | "B"@) @^+ ::= "0" | "1" - ::= "0" @["o"|"O"@] @^+ + ::= "0" @["o" | "O"@] @^+ - ::= "0" | "1" $| \ldots |$ "7" + ::= "0" | "1" | $\cdots$ | "7" - ::= "0" @("x"|"X"@) @^+ + ::= "0" @("x" | "X"@) @^+ ::= -\alt "A" | "B" | "C" | "D" | "E" | "F" -\alt "a" | "b" | "c" | "d" | "e" | "f" + | "A" | "B" | "C" | "D" | "E" | "F" + | "a" | "b" | "c" | "d" | "e" | "f" \end{grammar} Sod understands only integers, not floating-point numbers; its integer syntax @@ -130,15 +130,16 @@ binary. However, length and signedness indicators are not permitted. \subsection{Punctuation} \label{sec:syntax.lex.punct} \begin{grammar} - ::= any nonalphanumeric character other than "_", "\"" or "'" + ::= "<<" | ">>" | "||" | "&&" + | "<=" | ">=" | "==" | "!=" | "\dots" +\alt any nonalphanumeric character other than "_", "\"", or "'" \end{grammar} \subsection{Comments} \label{sec:syntax.lex.comment} \begin{grammar} - ::= -\alt + ::= | ::= "/*" @@ -323,7 +324,7 @@ defined in the built-in module. ::= $[\epsilon, \mbox{@}]$ ::= - $[\mbox{@ @! $\epsilon$}, \mbox{@}]$ + $[\mbox{@ | $\epsilon$}, \mbox{@}]$ ::= $[\mbox{@}, \mbox{@}]$ @@ -351,7 +352,7 @@ keyword arguments. @[$[\mbox{@}]$@] "?" @[$[\mbox{@}]$@] - ::= @! + ::= | ::= "." @@ -367,18 +368,53 @@ keyword arguments. ::= "=" - ::= | "+" | "--" + ::= - ::= | "*" | "/" + ::= + | "||" - ::= | "+" | "--" + ::= + | "&&" + + ::= + | "|" + + ::= + | "^" + + ::= + | "&" + + ::= + | "==" + | "!=" + + ::= + | "<" + | "<=" + | ">=" + | ">" + + ::= + | "<<" + | ">>" + + ::= + | "+" + | "--" + + ::= + | "*" + | "/" + + ::= + | "!" | "~" factor + | "+" | "--" ::= | | | -\alt "<" ">" -\alt "{" "}" -\alt "?" -\alt "(" ")" +\alt "<" ">" | "{" "}" | "?" + | "(" ")" \end{grammar} \emph{Property sets} are a means for associating miscellaneous information @@ -462,10 +498,10 @@ above, are as follows. \item The @|boolean| output type denotes a boolean value, which may be either true or false. A value of type @|id| is considered true if it is @|true|, - @|t|, @|yes|, @|on|, or @|verily|; or false if it is @|false|, @|nil|, - @|no|, @|off|, or @|nowise|; it is erroneous to provide any other - identifier where a boolean value is wanted. A value of type @|int| is - considered true if it is nonzero, or false if it is zero. + @|t|, @|yes|, @|on|, @|yup|, or @|verily|; or false if it is @|false|, + @|nil|, @|no|, @|off|, @|nope|, or @|nowise|; it is erroneous to provide + any other identifier where a boolean value is wanted. A value of type + @|int| is considered true if it is nonzero, or false if it is zero. \item The @|symbol| output type denotes a Lisp symbol. @@ -476,7 +512,7 @@ above, are as follows. upper; if the name contains letters of both cases, then it is not changed. For example, @|foo45| becomes @|FOO45|, or \emph{vice-versa}; but @|Splat| remains as it is. Second, the name is subjected to \emph{separator - switching}: all underscores in the name are replaced with hyphens (and + switching}: all underscores in the name are replaced with hyphens (and \emph{vice-versa}, though hyphens aren't permitted in identifiers in the first place). Finally, the resulting name is interned in the current package, which will usually be @|sod-user| unless changed explicitly by the @@ -634,14 +670,18 @@ declarations instead. \begin{grammar} ::= - "code" ":" @[@] + "code" ":" @[@] "{" "}" +\alt + "code" ":" ";" + + ::= ::= "[" $[\mbox{@}]$ "]" ::= @^+ - ::= @! "(" @^+ ")" + ::= | "(" @^+ ")" \end{grammar} The @ will be output unchanged to one of the output files. @@ -726,8 +766,9 @@ 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. 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. +seems suitable. A class with no direct superclasses is called a \emph{root +class}. It is not possible to define a 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. @@ -862,6 +903,9 @@ Properties: \begin{description} \item[@|message_class|] A symbol naming the Lisp class to use to represent the message. +\item[@|readonly|] A boolean indicating whether the message guarantees not to + modify its receiver. If this is true, the receiver will be declared + @"const". \item[@|combination|] A keyword naming the aggregating method combination to use. \item[@|most_specific|] A keyword, either @`first' or @`last', according to