X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/180bfa7ca8efeb1297a0bc3f0ff55b02b4e40f9b..4fd69126f8b52945e0a572d1cf4a347468c1ced5:/src/final.lisp diff --git a/src/final.lisp b/src/final.lisp index 12b6294..1b87c26 100644 --- a/src/final.lisp +++ b/src/final.lisp @@ -7,7 +7,7 @@ ;;;----- Licensing notice --------------------------------------------------- ;;; -;;; This file is part of the Sensble Object Design, an object system for C. +;;; This file is part of the Sensible Object Design, an object system for C. ;;; ;;; SOD is free software; you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License as published by @@ -26,6 +26,13 @@ (cl:in-package #:sod) ;;;-------------------------------------------------------------------------- +;;; Miscellaneous details. + +(export '*sod-version*) +(defparameter *sod-version* sod-sysdef:*version* + "The version of the SOD translator system, as a string.") + +;;;-------------------------------------------------------------------------- ;;; Debugging utilities. (export '*debugout-pathname*) @@ -35,7 +42,6 @@ (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." - (unless *builtin-module* (make-builtin-module)) (clear-the-decks) (setf *module-map* (make-hash-table :test #'equal)) (with-open-file (out *debugout-pathname* @@ -44,6 +50,54 @@ :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. + + This is a macro so that the parser can use the fancy syntax. The name + SCANNER is bound to a `sod-token-scanner' reading tokens from the INPUT + string. Then the PARSER is invoked and three values are returned: a + `successp' flag indicating whether the parser succeeded; the result, + output or error indicator, of the parser; and a list consisting of the + lookahead token type and value, and a string containing the untokenized + remaining input." + (once-only (input) + (with-gensyms (char-scanner value winp consumedp where) + `(let* ((,char-scanner (make-string-scanner ,input)) + (,scanner (make-instance 'sod-token-scanner + :char-scanner ,char-scanner + :filename ""))) + (with-parser-context (token-scanner-context :scanner ,scanner) + (multiple-value-bind (,value ,winp ,consumedp) (parse ,parser) + (declare (ignore ,consumedp)) + (let ((,where (scanner-capture-place ,char-scanner))) + (values ,winp ,value + (list (token-type ,scanner) (token-value ,scanner) + (subseq ,input ,where)))))))))) + ;;;-------------------------------------------------------------------------- ;;; Calisthenics.