+(export 'class-item)
+
+(define-pluggable-parser class-item initfrags (scanner class pset)
+ ;; raw-class-item ::= frag-keyword `{' c-fragment `}'
+ ;; frag-keyword ::= `init' | `teardown'
+ (with-parser-context (token-scanner-context :scanner scanner)
+ (parse (seq ((make (or (seq ("init") #'make-sod-class-initfrag)
+ (seq ("teardown") #'make-sod-class-tearfrag)))
+ (frag (parse-delimited-fragment scanner #\{ #\})))
+ (funcall make class frag pset scanner)))))
+
+(define-pluggable-parser class-item initargs (scanner class pset)
+ ;; initarg-item ::= `initarg' declspec+ list[init-declarator]
+ ;; init-declarator ::= declarator [`=' initializer]
+ (with-parser-context (token-scanner-context :scanner scanner)
+ (parse (seq ("initarg"
+ (base-type (parse-c-type scanner))
+ (nil (skip-many (:min 1)
+ (seq ((declarator (parse-declarator scanner
+ base-type))
+ (init (? (parse-delimited-fragment
+ scanner #\= (list #\; #\,)
+ :keep-end t))))
+ (make-sod-user-initarg class
+ (cdr declarator)
+ (car declarator)
+ pset init scanner))
+ #\,))
+ (nil (must #\;)))))))
+
+(defun parse-class-body (scanner pset name supers)