chiark / gitweb /
src/method-{proto,impl}.lisp: Abolish `sod-message-no-varargs-tail'.
[sod] / src / module-parse.lisp
index 8022bbf6e6f4f4da001a14567d4ffa7d15eee620..a45892216da5c362beb0b2493576078e30f7ac16 100644 (file)
@@ -48,22 +48,28 @@ (define-pluggable-parser module typename (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 `]'
-  ;; 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)))
@@ -214,6 +220,7 @@ (defun parse-class-body (scanner pset name supers)
                 ;; names.
                 (parse-declarator
                  scanner base-type
+                 :keywordp t
                  :kernel (parser ()
                            (seq ((name-a :id)
                                  (name-b (? (seq (#\. (id :id)) id))))