chiark / gitweb /
src/final.lisp (test-module): Don't try output if parsing failed.
[sod] / src / module-parse.lisp
index 35e07ea791a5f2b086d57501ec8f652ccb427d98..bccc37b71ace3714b4fe85135238bca1243b67b6 100644 (file)
@@ -101,17 +101,21 @@ (defun read-module (pathname &key (truename nil truep) location)
   (define-module (pathname :location location :truename truename)
     (with-open-file (f-stream pathname :direction :input)
       (let* ((*readtable* (copy-readtable))
+            (*package* (find-package '#:sod-user))
             (char-scanner (make-instance 'charbuf-scanner
                                          :stream f-stream))
             (scanner (make-instance 'sod-token-scanner
                                     :char-scanner char-scanner)))
        (with-default-error-location (scanner)
          (with-parser-context (token-scanner-context :scanner scanner)
-           (parse (skip-many ()
-                    (seq ((pset (parse-property-set scanner))
-                          (nil (error ()
-                                 (plug module scanner pset))))
-                      (check-unused-properties pset))))))))))
+           (multiple-value-bind (result winp consumedp)
+               (parse (skip-many ()
+                         (seq ((pset (parse-property-set scanner))
+                               (nil (error ()
+                                      (plug module scanner pset))))
+                           (check-unused-properties pset))))
+             (declare (ignore consumedp))
+             (unless winp (syntax-error scanner result)))))))))
 
 (define-pluggable-parser module test (scanner pset)
   ;; `demo' string `;'
@@ -233,7 +237,13 @@ (defun parse-class-body (scanner pset name supers)
   ;; class-item ::= property-set raw-class-item
   (with-parser-context (token-scanner-context :scanner scanner)
     (make-class-type name)
-    (let* ((class (make-sod-class name (mapcar #'find-sod-class supers)
+    (let* ((duff nil)
+          (class (make-sod-class name
+                                 (restart-case
+                                     (mapcar #'find-sod-class supers)
+                                   (continue ()
+                                     (setf duff t)
+                                     (list (find-sod-class "SodObject"))))
                                  pset scanner))
           (nick (sod-class-nickname class)))
 
@@ -345,7 +355,7 @@ (defun parse-class-body (scanner pset name supers)
                        (when (consp name)
                          (cerror*-with-location
                           scanner
-                          "Method declarations must have function type.")
+                          "Method declarations must have function type")
                          (setf name (cdr name)))
                        (parse-slot-item sub-pset base-type type name))
                       ((consp name)
@@ -369,6 +379,7 @@ (defun parse-class-body (scanner pset name supers)
                            (peek
                             (seq ((ds (parse-c-type scanner))
                                   (dc (parse-maybe-dotted-declarator ds))
+                                  (nil (commit))
                                   (nil (class-item-dispatch sub-pset
                                                             ds
                                                             (car dc)
@@ -388,18 +399,19 @@ (defun parse-class-body (scanner pset name supers)
                              (check-unused-properties sub-pset))))
                     (nil (error () #\})))
                 (finalize-sod-class class)
-                (add-to-module *module* class)))))))
+                (unless duff
+                  (add-to-module *module* class))))))))
 
 (define-pluggable-parser module class (scanner pset)
-  ;; `class' id [`:' id-list] class-body
+  ;; `class' id `:' id-list class-body
   ;; `class' id `;'
   (with-parser-context (token-scanner-context :scanner scanner)
     (parse (seq ("class"
                 (name :id)
                 (nil (or (seq (#\;)
                            (make-class-type name))
-                         (seq ((supers (? (seq (#\: (ids (list () :id #\,)))
-                                            ids)))
+                         (seq ((supers (seq (#\: (ids (list () :id #\,)))
+                                         ids))
                                (nil (parse-class-body
                                      scanner
                                      pset name supers)))))))))))