X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/sod/blobdiff_plain/f64eb323a5798e155cc494043f5f750abf50a482..ffc2a7b8364cc459ff686cfce645079b52d11466:/src/module-parse.lisp diff --git a/src/module-parse.lisp b/src/module-parse.lisp index 15a7d8f..da1c47f 100644 --- a/src/module-parse.lisp +++ b/src/module-parse.lisp @@ -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 `;' @@ -392,15 +396,15 @@ (defun parse-class-body (scanner pset name supers) (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)))))))))))