X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/sod/blobdiff_plain/118f5c0006f241bc7c03a7741f73b87b92b4e938..4ee476bc29b80fca2faabb4bd286ca70c98f7a44:/src/final.lisp diff --git a/src/final.lisp b/src/final.lisp index b98acd1..96e9625 100644 --- a/src/final.lisp +++ b/src/final.lisp @@ -39,16 +39,20 @@ (export '*debugout-pathname*) (defvar *debugout-pathname* #p"debugout.c") (export 'test-module) -(defun test-module (path &key reason) +(defun test-module (path &key reason clear backtrace) "Read a module from PATH, to exercise the machinery. + If CLEAR is non-nil, then reset the translator's state before proceeding. + If REASON is non-nil, then output the module to `*debugout-pathname*' with that REASON. Return a two-element list (NERROR NWARNING) of the number of errors and warnings encountered while processing the module." + (when clear (clear-the-decks)) (multiple-value-bind (module nerror nwarning) - (count-and-report-errors () (read-module path)) + (if backtrace (read-module path) + (count-and-report-errors () (read-module path))) (when (and module reason) (with-open-file (out *debugout-pathname* :direction :output @@ -106,16 +110,16 @@ (defmacro test-parser ((scanner &key backtrace) parser input) ,scanner (make-instance 'sod-token-scanner :char-scanner ,char-scanner)) - (multiple-value-bind (,value ,winp ,consumedp) - (parse ,parser) - (declare (ignore ,consumedp)) - (cond (,winp ,value) - (t (syntax-error ,scanner ,value) - nil))))) + (with-default-error-location (,scanner) + (multiple-value-bind (,value ,winp ,consumedp) + (parse ,parser) + (declare (ignore ,consumedp)) + (cond (,winp ,value) + (t (syntax-error ,scanner ,value) + nil)))))) (if ,backtrace (,body) (count-and-report-errors () - (with-default-error-location (,scanner) - (,body))))) + (,body)))) (let ((,where (scanner-capture-place ,char-scanner))) (values ,value (list ,nerror ,nwarn)