\end{quote}
\item @[@<item>@] means an optional @<item>:
\begin{quote}
- \syntax{@[<item>@] ::= $\epsilon$ | <item>}
+ \syntax{@[<item>@] ::= $\epsilon$ @! <item>}
\end{quote}
\item @<item>^* means a sequence of zero or more @<item>s:
\begin{quote}
- \syntax{@<item>^* ::= $\epsilon$ | @<item>^* <item>}
+ \syntax{@<item>^* ::= $\epsilon$ @! @<item>^* <item>}
\end{quote}
\item @<item>^+ means a sequence of one or more @<item>s:
\begin{quote}
\item @<item-list> means a sequence of one or more @<item>s separated
by commas:
\begin{quote}
- \syntax{<item-list> ::= <item> | <item-list> "," <item>}
+ \syntax{<item-list> ::= <item> @! <item-list> "," <item>}
\end{quote}
\end{itemize}
\subsubsection{Declarators} \label{sec:syntax.c-types.declarator}
\begin{grammar}
-<declarator> ::=
- @<pointer>^* <inner-declarator> @<declarator-suffix>^*
+<declarator>$[k]$ ::= @<pointer>^* <primary-declarator>$[k]$
-<inner-declarator> ::= <identifier> | <qualified-identifier>
-\alt "(" <declarator> ")"
-
-<qualified-identifier> ::= <identifier> "." <identifier>
+<primary-declarator>$[k]$ ::= $k$
+\alt "(" <primary-declarator>$[k]$ ")"
+\alt <primary-declarator>$[k]$ @<declarator-suffix>^*
<pointer> ::= "*" @<qualifier>^*
<declarator-suffix> ::= "[" <c-fragment> "]"
\alt "(" <arguments> ")"
-<arguments> ::= <empty> | "..."
+<arguments> ::= $\epsilon$ | "..."
\alt <argument-list> @["," "..."@]
<argument> ::= @<declaration-specifier>^+ <argument-declarator>
-<argument-declarator> ::= <declarator> | @[<abstract-declarator>@]
+<argument-declarator> ::= <declarator>@[<identifier> @! $\epsilon$@]
+
+<simple-declarator> ::= <declarator>@[<identifier>@]
-<abstract-declarator> ::=
- @<pointer>^+ | @<pointer>^* <inner-abstract-declarator>
+<dotted-name> ::= <identifier> "." <identifier>
-<inner-abstract-declarator> ::= "(" <abstract-declarator> ")"
-\alt @[<inner-abstract-declarator>@] @<declarator-suffix>^+
+<dotted-declarator> ::= <declarator>@[<dotted-name>@]
\end{grammar}
The declarator syntax is taken from C, but with some differences.