src/final.lisp: Add function for interactively testing type parsing.
authorMark Wooding <mdw@distorted.org.uk>
Thu, 26 May 2016 08:26:09 +0000 (09:26 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sun, 29 May 2016 14:08:43 +0000 (15:08 +0100)
I end up writing this a lot at the REPL, so it's useful to have it
wrapped up somewhere.

doc/SYMBOLS
doc/misc.tex
src/final.lisp

index 26b7c02..ced5f77 100644 (file)
@@ -401,6 +401,7 @@ final.lisp
   *sod-version*                                 variable
   exercise                                      function
   test-module                                   function
+  test-parse-c-type                             function
   test-parser                                   macro
 
 fragment-parse.lisp
index 06791f4..dce192e 100644 (file)
@@ -533,6 +533,11 @@ These symbols are defined in the @!optparse| package.
 \begin{describe}{fun}{test-module @<path> @<reason>}
 \end{describe}
 
+\begin{describe}{fun}
+    {test-parse-c-type @<string>
+      @> t @<c-type> @<kernel> @<string> @! nil @<indicator>}
+\end{describe}
+
 \begin{describe}{mac}
     {test-parser (@<scanner>) @<parser> @<input>
       @> @<success-flag> @<result> @<remainder>}
index 071ebc9..1b87c26 100644 (file)
                   :if-does-not-exist :create)
     (output-module (read-module path) reason out)))
 
+(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 "<string>"))
+          (tokscan (make-instance 'sod-token-scanner
+                                  :char-scanner charscan
+                                  :filename "<string>")))
+      (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)))))))
+
 (export 'test-parser)
 (defmacro test-parser ((scanner &key) parser input)
   "Convenient macro for testing parsers at the REPL.