<id-start-char> ::= <alpha-char> | "_"
-<id-body-char> ::= <id-start-char> @! <digit-char>
+<id-body-char> ::= <id-start-char> | <digit-char>
-<alpha-char> ::= "A" | "B" $| \cdots |$ "Z"
- | "a" | "b" $| \cdots |$ "z"
+<alpha-char> ::= "A" | "B" | $\cdots$ | "Z"
+ | "a" | "b" | $\cdots$ | "z"
| <extended-alpha-char>
<digit-char> ::= "0" | <nonzero-digit-char>
-<nonzero-digit-char> ::= "1" | "2" $| \cdots |$ "9"
+<nonzero-digit-char> ::= "1" | "2" | $\cdots$ | "9"
\end{grammar}
The precise definition of @<alpha-char> is left to the function
<decimal-integer> ::= "0" | <nonzero-digit-char> @<digit-char>^*
-<binary-integer> ::= "0" @("b" @! "B"@) @<binary-digit-char>^+
+<binary-integer> ::= "0" @("b" | "B"@) @<binary-digit-char>^+
<binary-digit-char> ::= "0" | "1"
-<octal-integer> ::= "0" @["o" @! "O"@] @<octal-digit-char>^+
+<octal-integer> ::= "0" @["o" | "O"@] @<octal-digit-char>^+
-<octal-digit-char> ::= "0" | "1" $| \cdots |$ "7"
+<octal-digit-char> ::= "0" | "1" | $\cdots$ | "7"
-<hex-integer> ::= "0" @("x" @! "X"@) @<hex-digit-char>^+
+<hex-integer> ::= "0" @("x" | "X"@) @<hex-digit-char>^+
<hex-digit-char> ::= <digit-char>
| "A" | "B" | "C" | "D" | "E" | "F"
<abstract-declarator> ::= <declarator>$[\epsilon, \mbox{@<argument-list>}]$
<argument-declarator> ::=
- <declarator>$[\mbox{@<identifier> @! $\epsilon$}, \mbox{@<argument-list>}]$
+ <declarator>$[\mbox{@<identifier> | $\epsilon$}, \mbox{@<argument-list>}]$
<simple-declarator> ::=
<declarator>$[\mbox{@<identifier>}, \mbox{@<argument-list>}]$
@[<list>$[\mbox{@<argument>}]$@]
"?" @[<list>$[\mbox{@<keyword-argument>}]$@]
-<method-argument-list> ::= <argument-list> @! <keyword-argument-list>
+<method-argument-list> ::= <argument-list> | <keyword-argument-list>
<dotted-name> ::= <identifier> "." <identifier>
<code-definition> ::=
"code" <reason> ":" <item-name> @[<constraints>@]
"{" <c-fragment> "}"
+\alt
+ "code" <reason> ":" <constraints> ";"
<reason> ::= <identifier>
<constraint> ::= @<item-name>^+
-<item-name> ::= <identifier> @! "(" @<identifier>^+ ")"
+<item-name> ::= <identifier> | "(" @<identifier>^+ ")"
\end{grammar}
The @<c-fragment> will be output unchanged to one of the output files.
elsewhere in the generated output files.
+\subsection{Static instance definitions} \label{sec:syntax.module.instance}
+
+\begin{grammar}
+<static-instance-definition> ::=
+ "instance" <identifier> <identifier>
+ @[":" <list>$[\mbox{@<instance-initializer>}]$@] ";"
+
+<instance-initializer> ::= <identifier> "." <identifier> "=" <c-fragment>
+\end{grammar}
+
+Properties:
+\begin{description}
+\item[@"extern"] A boolean flag: if true, then the instance is public, and
+ will be declared in the output header file; if false (the default), then
+ the instance is only available to code defined within the module.
+\item[@"const"] A boolean flag: if true (the default), then the instance is
+ read-only, and may end up in write-protected storage at run-time; if false,
+ then the instance will be writable.
+\end{description}
+
+
\subsection{Class definitions} \label{sec:syntax.module.class}
\begin{grammar}
\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