summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
298c037)
A sequence of identifiers can be written in parentheses. There's still
no way to refer to items whose names contain objects such as classes or
methods. This probably isn't too disastrous.
\begin{grammar}
<code-definition> ::=
\begin{grammar}
<code-definition> ::=
- "code" <identifier> ":" <identifier> @[<constraints>@]
+ "code" <identifier> ":" <item-name> @[<constraints>@]
"{" <c-fragment> "}"
<constraints> ::= "[" <list>$[\mbox{@<constraint>}]$ "]"
"{" <c-fragment> "}"
<constraints> ::= "[" <list>$[\mbox{@<constraint>}]$ "]"
-<constraint> ::= @<identifier>^+
+<constraint> ::= @<item-name>^+
+
+<item-name> ::= <identifier> @! "(" @<identifier>^+ ")"
\end{grammar}
The @<c-fragment> will be output unchanged to one of the output files.
\end{grammar}
The @<c-fragment> will be output unchanged to one of the output files.
output file names are @"c" and @"h", which are the implementation code and
header file respectively; other output files can be defined by extensions.
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 @<identifier> 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 @<constraints> 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 @<constraint>
The @<constraints> 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 @<constraint>
-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"
There is a predefined output item @"includes" in both the @"c" and @"h"
output files which is a suitable place for inserting @"\#include"
;;; Fragments.
(define-pluggable-parser module code (scanner pset)
;;; Fragments.
(define-pluggable-parser module code (scanner pset)
- ;; `code' id `:' id [constraints] `{' c-fragment `}'
+ ;; `code' id `:' item-name [constraints] `{' c-fragment `}'
;;
;; constrains ::= `[' constraint-list `]'
;;
;; constrains ::= `[' constraint-list `]'
+ ;; constraint ::= item-name+
+ ;; item-name ::= id | `(' id+ `)'
(declare (ignore pset))
(with-parser-context (token-scanner-context :scanner scanner)
(declare (ignore pset))
(with-parser-context (token-scanner-context :scanner scanner)
- (flet ((kw ()
- (parse (seq ((kw :id))
- (intern (frob-identifier kw) 'keyword)))))
+ (labels ((kw ()
+ (parse (seq ((kw :id))
+ (intern (frob-identifier kw) 'keyword))))
+ (item ()
+ (parse (or (kw)
+ (seq (#\( (names (list (:min 1) (kw))) #\))
+ names)))))
(parse (seq ("code"
(reason (kw))
#\:
(parse (seq ("code"
(reason (kw))
#\:
(constraints (? (seq (#\[
(constraints (list (:min 1)
(constraints (? (seq (#\[
(constraints (list (:min 1)
+ (list (:min 1)
+ (item))
#\,))
#\])
constraints)))
#\,))
#\])
constraints)))
.RI [ constraints ]
.B {
.I c-fragment
.RI [ constraints ]
.B {
.I c-fragment
+.IR item-name \*+
+.br
+.I item-name
+::=
+.I identifier
+|
+.B (
.
.SS Class definitions
.I
.
.SS Class definitions
.I