;;; Fragments.
(define-pluggable-parser module code (scanner pset)
- ;; `code' id `:' id [constraints] `{' c-fragment `}'
+ ;; `code' id `:' item-name [constraints] `{' c-fragment `}'
;;
;; constrains ::= `[' constraint-list `]'
- ;; constraint ::= id+
+ ;; constraint ::= item-name+
+ ;; item-name ::= id | `(' id+ `)'
(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))
#\:
- (name (kw))
+ (name (item))
(constraints (? (seq (#\[
(constraints (list (:min 1)
- (list (:min 1) (kw))
+ (list (:min 1)
+ (item))
#\,))
#\])
constraints)))
;; names.
(parse-declarator
scanner base-type
+ :keywordp t
:kernel (parser ()
(seq ((name-a :id)
(name-b (? (seq (#\. (id :id)) id))))