From 4fd69126f8b52945e0a572d1cf4a347468c1ced5 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Thu, 26 May 2016 09:26:09 +0100 Subject: [PATCH] src/final.lisp: Add function for interactively testing type parsing. I end up writing this a lot at the REPL, so it's useful to have it wrapped up somewhere. --- doc/SYMBOLS | 1 + doc/misc.tex | 5 +++++ src/final.lisp | 23 +++++++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/doc/SYMBOLS b/doc/SYMBOLS index 26b7c02..ced5f77 100644 --- a/doc/SYMBOLS +++ b/doc/SYMBOLS @@ -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 diff --git a/doc/misc.tex b/doc/misc.tex index 06791f4..dce192e 100644 --- a/doc/misc.tex +++ b/doc/misc.tex @@ -533,6 +533,11 @@ These symbols are defined in the @!optparse| package. \begin{describe}{fun}{test-module @ @} \end{describe} +\begin{describe}{fun} + {test-parse-c-type @ + @> t @ @ @ @! nil @} +\end{describe} + \begin{describe}{mac} {test-parser (@) @ @ @> @ @ @} diff --git a/src/final.lisp b/src/final.lisp index 071ebc9..1b87c26 100644 --- a/src/final.lisp +++ b/src/final.lisp @@ -50,6 +50,29 @@ :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 "")) + (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))))))) + (export 'test-parser) (defmacro test-parser ((scanner &key) parser input) "Convenient macro for testing parsers at the REPL. -- 2.11.0