From b39de3509f8726abc90d45a58d4b9e97758a6346 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sat, 7 Jul 2018 00:06:15 +0100 Subject: [PATCH] src/final.lisp (test-parse-c-type): Abstract out the tedious setup stage. --- src/final.lisp | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/src/final.lisp b/src/final.lisp index 96e9625..0b7a366 100644 --- a/src/final.lisp +++ b/src/final.lisp @@ -61,28 +61,37 @@ (output-module module reason out))) (list nerror nwarning))) +(defmacro with-test-scanner ((scanner string) &body body) + "Common machinery for `test-parse-MUMBLE' below. + + This is too specialized to make more widely available." + (with-gensyms (in charscan) + (once-only (string) + `(with-input-from-string (,in ,string) + (let* ((*module-type-map* (make-hash-table)) + (,charscan (make-instance 'charbuf-scanner + :stream ,in + :filename "")) + (,scanner (make-instance 'sod-token-scanner + :char-scanner ,charscan + :filename ""))) + (with-parser-context (token-scanner-context :scanner ,scanner) + ,@body)))))) + (export 'test-parse-c-type) (defun test-parse-c-type (string) "Parse STRING as a C type, with optional kernel, and show the results." - (with-input-from-string (in string) - (let* ((*module-type-map* (make-hash-table)) - (charscan (make-instance 'charbuf-scanner - :stream in - :filename "")) - (tokscan (make-instance 'sod-token-scanner - :char-scanner charscan - :filename ""))) - (with-parser-context (token-scanner-context :scanner tokscan) - (multiple-value-bind (value winp consumedp) - (parse (seq ((decls (parse-c-type tokscan)) - (type (parse-declarator tokscan decls :abstractp t)) - :eof) - type)) - (declare (ignore consumedp)) - (if winp - (values t (car value) (cdr value) - (princ-to-string (car value))) - (values nil value))))))) + (with-test-scanner (scanner string) + (multiple-value-bind (value winp consumedp) + (parse (seq ((decls (parse-c-type scanner)) + (type (parse-declarator scanner decls :abstractp t)) + :eof) + type)) + (declare (ignore consumedp)) + (if winp + (values t (car value) (cdr value) + (princ-to-string (car value))) + (values nil value))))) (export 'test-parser) (defmacro test-parser ((scanner &key backtrace) parser input) -- 2.11.0