doc-src/IsarRef/syntax.tex
author wenzelm
Tue, 20 Jul 1999 18:50:46 +0200
changeset 7050 c70d3402fef5
parent 7046 9f755ff43cff
child 7134 320b412e5800
permissions -rw-r--r--
checkpoint;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
     1
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
     2
%FIXME
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
     3
% - examples (!?)
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
     4
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
     5
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
     6
\chapter{Isar document syntax}
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
     7
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
     8
FIXME important note: inner versus outer syntax
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
     9
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    10
\section{Lexical matters}
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    11
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    12
\section{Common syntax entities}
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    13
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    14
The Isar proof and theory language syntax has been carefully designed with
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    15
orthogonality in mind.  Many common syntax entities such that those for names,
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    16
terms, types etc.\ have been factored out.  Some of these basic syntactic
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    17
entities usually represent the level of abstraction for error messages: e.g.\ 
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    18
some higher syntax element such as $\CONSTS$ referring to \railtoken{name} or
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    19
\railtoken{type}, would really report a missing \railtoken{name} or
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    20
\railtoken{type} rather than any of its constituent primitive tokens (as
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    21
defined below).  These quasi-tokens are represented in the syntax diagrams
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    22
below using the same font as actual tokens (such as \railtoken{string}).
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    23
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    24
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    25
\subsection{Names}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    26
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    27
Entity \railtoken{name} usually refers to any name of types, constants,
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    28
theorems, etc.\ to be \emph{declared} or \emph{defined} (so qualified
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    29
identifiers are excluded).  Already existing objects are typically referenced
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    30
by \railtoken{nameref}.
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    31
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    32
\indexoutertoken{name}\indexoutertoken{nameref}
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    33
\begin{rail}
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    34
  name : ident | symident | string
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    35
  ;
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    36
  nameref : name | longident
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    37
  ;
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    38
\end{rail}
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    39
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    40
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    41
\subsection{Comments}
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    42
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    43
Large chunks of verbatim \railtoken{text} are usually given
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    44
\railtoken{verbatim}, i.e.\ enclosed in \verb|{*|~\verb|*}|; for convenience,
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    45
any of the smaller text entities (\railtoken{ident}, \railtoken{string} etc.)
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    46
are admitted as well.  Almost any of the Isar commands may be annotated by a
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    47
marginal comment: \texttt{--} \railtoken{text}.  Note that this kind of
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    48
comment is actually part of the language, while source level comments
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    49
\verb|(*|~\verb|*)| are already stripped at the lexical level.  A few commands
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    50
such as $\PROOFNAME$ admit some parts to be mark with a ``level of interest'':
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    51
currently only \texttt{\%} for ``boring, don't read this''.
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    52
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    53
\indexoutertoken{text}\indexouternonterm{comment}\indexouternonterm{interest}
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    54
\begin{rail}
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    55
  text : verbatim | nameref
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    56
  ;
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    57
  comment : (() | '--' text)
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    58
  ;
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    59
  interest : (() | '\%')
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    60
  ;
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    61
\end{rail}
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    62
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    63
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    64
\subsection{Sorts and arities}
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    65
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    66
The syntax of sorts and arities is given directly at the outer level.  Note
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    67
that this in contrast to that types and terms (see below).  Only few commands
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    68
ever refer to sorts or arities explicitly.
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    69
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    70
\indexouternonterm{sort}\indexouternonterm{arity}\indexouternonterm{simplearity}
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    71
\begin{rail}
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    72
  sort : nameref | lbrace (nameref * ',') rbrace
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    73
  ;
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    74
  arity : ( () | '(' (sort + ',') ')' ) sort
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
    75
  ;
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    76
  simplearity : ( () | '(' (sort + ',') ')' ) nameref
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    77
  ;
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    78
\end{rail}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    79
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    80
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    81
\subsection{Types and terms}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    82
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    83
The actual inner Isabelle syntax, i.e.\ that of types and terms, is far too
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    84
flexible in order to be modeled explicitly at the outer theory level.
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    85
Basically, any such entity would have to be quoted at the outer level to turn
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    86
it into a single token, with the actual parsing deferred to some functions
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    87
that read and type-check terms etc.\ (note that \railtoken{prop}s will be
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    88
handled differently from plain \railtoken{term}s here).  For convenience, the
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    89
quotes may be omitted for any \emph{atomic} term or type (e.g.\ a single
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    90
variable).
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    91
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    92
\indexoutertoken{type}\indexoutertoken{term}\indexoutertoken{prop}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    93
\begin{rail}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    94
  type : ident | longident | symident | typefree | typevar | string
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    95
  ;
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    96
  term : ident | longident | symident | var | textvar | nat | string
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    97
  ;
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    98
  prop : term
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
    99
  ;
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   100
\end{rail}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   101
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   102
Type definitions etc.\ usually refer to \railnonterm{typespec} on the
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   103
left-hand side.  This models basic type constructor application at the outer
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   104
syntax level.  Note that only plain postfix notation is available here, but no
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   105
infixes.
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   106
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   107
\indexouternonterm{typespec}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   108
\begin{rail}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   109
  typespec : (() | typefree | '(' ( typefree + ',' ) ')') name
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   110
  ;
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   111
\end{rail}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   112
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   113
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   114
\subsection{Term patterns}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   115
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   116
Statements like $\SHOWNAME$ involve propositions, some others like $\DEFNAME$
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   117
plain terms.  Any of these usually admit automatic binding of schematic text
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   118
variables by giving (optional) patterns $\IS{p@1 \dots p@n}$.  For
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   119
\railtoken{prop}s the $\CONCLNAME$ part refers to the conclusion only, in case
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   120
actual rules are involved, rather than atomic propositions.
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   121
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   122
\indexouternonterm{termpat}\indexouternonterm{proppat}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   123
\begin{rail}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   124
  termpat : '(' (term + 'is' ) ')'
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   125
  ;
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   126
  proppat : '(' (() | (prop + 'is' )) (() | 'concl' (prop + 'is' )) ')'
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   127
  ;
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   128
\end{rail}
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   129
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   130
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   131
\subsection{Mixfix annotations}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   132
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   133
Mixfix annotations specify concrete \emph{inner} syntax.  Some commands such
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   134
as $\TYPES$ admit infixes only, while $\CONSTS$ etc.\ support the full range
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   135
of general mixfixes and binders.
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   136
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   137
\indexouternonterm{infix}\indexouternonterm{mixfix}
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   138
\begin{rail}
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   139
  infix : '(' ('infixl' | 'infixr') (() | string) nat ')'
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   140
  ;
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   141
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   142
  mixfix : infix | string (() | '[' (nat + ',') ']') (() | nat) |
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   143
  'binder' string (() | '[' (nat + ',') ']') nat
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   144
  ;
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   145
\end{rail}
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   146
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   147
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   148
\subsection{Attributes and theorem specifications}\label{sec:syn-att}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   149
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   150
Attributes (and proof methods, see \S\ref{sec:syn-meth}) have their own
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   151
``semi-inner'' syntax, which does not have to be atomic at the outer level
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   152
unlike that of types and terms.  Instead, the attribute argument
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   153
specifications may be any sequence of atomic entities (identifiers, strings
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   154
etc.), or properly bracketed argument lists.  Below \railtoken{atom} refers to
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   155
any atomic entity (\railtoken{ident}, \railtoken{longident},
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   156
\railtoken{symident} etc.), including keywords that conform to
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   157
\railtoken{symident}, but do not coincide with actual command names.
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   158
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   159
\indexoutertoken{atom}\indexouternonterm{args}\indexouternonterm{attributes}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   160
\begin{rail}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   161
  args : (atom | '(' (args *) ')' | '[' (args *) ']' | lbrace (args *) rbrace) *
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   162
  ;
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   163
  attributes : '[' (name args + ',') ']'
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   164
  ;
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   165
\end{rail}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   166
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   167
Theorem specifications come in three flavours: \railnonterm{thmdecl} usually
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   168
refers to the result of a goal statement (such as $\SHOWNAME$),
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   169
\railnonterm{thmdef} collects lists of existing theorems (as in $\NOTENAME$),
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   170
\railnonterm{thmref} refers to any list of existing theorems (e.g.\ occurring
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   171
as proof method arguments).  Any of these may include lists of attributes,
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   172
which are applied to the preceding theorem or list of theorems.
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   173
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   174
\indexouternonterm{thmdecl}\indexouternonterm{thmdef}\indexouternonterm{thmref}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   175
\begin{rail}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   176
  thmdecl : (() | name) (() | attributes) ':'
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   177
  ;
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   178
  thmdef : (() | name) (() | attributes) '='
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   179
  ;
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   180
  thmref : (name (() | attributes) +)
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   181
  ;
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   182
\end{rail}
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   183
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   184
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   185
\subsection{Proof methods}\label{sec:syn-meth}
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   186
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   187
Proof methods are either basic ones, or expressions composed of methods via
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   188
``\texttt{,}'' (sequential composition), ``\texttt{|}'' (alternatives),
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   189
``\texttt{?}'' (try), ``\texttt{*}'' (repeat, ${} \ge 0$ times),
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   190
``\texttt{+}'' (repeat, ${} > 0$ times).  In practice, proof methods are
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   191
typically just a comma separeted list of \railtoken{name}~\railtoken{args}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   192
specifications.  Thus the syntax is similar to that of attributes, with plain
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   193
parentheses instead of square brackets (see also \S\ref{sec:syn-att}).  Note
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   194
that parentheses may be dropped for methods without arguments.
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   195
7050
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   196
\indexouternonterm{method}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   197
\begin{rail}
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   198
  method : (name args | (name | '(' method ')') (() | '?' | '*' | '+')) + (',' | '|')
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   199
  ;
c70d3402fef5 checkpoint;
wenzelm
parents: 7046
diff changeset
   200
\end{rail}
7046
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   201
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   202
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   203
%%% Local Variables: 
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   204
%%% mode: latex
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   205
%%% TeX-master: "isar-ref"
9f755ff43cff skeleton only;
wenzelm
parents:
diff changeset
   206
%%% End: