chiark / gitweb /
src/module-parse.lisp: Improve error recovery for `code' items.
[sod] / src / module-parse.lisp
index f90f360ae61f2dfcecaaf87fadadfedc7cd2ac5b..142992ea971bd3c4f22ca0059ea6ee96e2d38c63 100644 (file)
@@ -36,14 +36,17 @@ (define-pluggable-parser module typename (scanner pset)
   (with-parser-context (token-scanner-context :scanner scanner)
     (parse (and "typename"
                (skip-many ()
-                 (seq ((id :id))
-                   (if (gethash id *module-type-map*)
-                       (cerror* "Type `~A' already defined" id)
-                       (add-to-module *module*
-                                      (make-instance 'type-item
-                                                     :name id))))
+                 (error ()
+                     (seq ((id :id))
+                       (if (or (gethash id *module-type-map*)
+                               (find-simple-c-type id))
+                           (cerror* "Type `~A' already defined" id)
+                           (add-to-module *module*
+                                          (make-instance 'type-item
+                                                         :name id))))
+                   (skip-until () #\, #\;))
                  #\,)
-               #\;))))
+               (must #\;)))))
 
 ;;; Fragments.
 
@@ -63,23 +66,28 @@ (define-pluggable-parser module code (scanner pset)
                          (seq (#\( (names (list (:min 1) (kw))) #\))
                            names)))))
       (parse (seq ("code"
-                  (reason (kw))
-                  #\:
-                  (name (item))
+                  (reason (must (kw)))
+                  (nil (must #\:))
+                  (name (must (item)))
                   (constraints (? (seq (#\[
-                                        (constraints (list (:min 1)
-                                                       (list (:min 1)
-                                                         (item))
-                                                       #\,))
+                                        (constraints
+                                         (list ()
+                                           (list (:min 1)
+                                             (error (:ignore-unconsumed t)
+                                                 (item)
+                                               (skip-until ()
+                                                 :id #\( #\, #\])))
+                                           #\,))
                                         #\])
                                     constraints)))
                   (fragment (parse-delimited-fragment scanner #\{ #\})))
-              (add-to-module *module*
-                             (make-instance 'code-fragment-item
-                                            :fragment fragment
-                                            :constraints constraints
-                                            :reason reason
-                                            :name name)))))))
+              (when name
+                (add-to-module *module*
+                               (make-instance 'code-fragment-item
+                                              :fragment fragment
+                                              :constraints constraints
+                                              :reason reason
+                                              :name name))))))))
 
 ;;; External files.
 
@@ -178,7 +186,7 @@ (define-pluggable-parser module set (scanner pset)
                                       :location (p-location prop))
                                      (setf (p-seenp prop) t))
                                    pset))
-                       (parse (skip-many (:min 0)
+                       (parse (skip-many (:min (if pset 0 1))
                                 (error (:ignore-unconsumed t)
                                     (parse-property scanner module-pset)
                                   (skip-until () #\, #\;))