(defvar *debugout-pathname* #p"debugout.c")
(export 'test-module)
-(defun test-module (path reason)
- "Reset the translator's state, read a module from PATH and output it with
- REASON, returning the result as a string."
+(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))
- (when reason
+ (if backtrace (read-module path)
+ (count-and-report-errors () (read-module path)))
+ (when (and module reason)
(with-open-file (out *debugout-pathname*
:direction :output
:if-exists :supersede
,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)