chiark / gitweb /
src/c-types-parse.lisp (parse-declarator): Explain how it works.
authorMark Wooding <mdw@distorted.org.uk>
Wed, 16 Dec 2015 05:49:38 +0000 (05:49 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sun, 29 May 2016 14:09:03 +0000 (15:09 +0100)
It's a little confusing, even to me.

src/c-types-parse.lisp

index b9a53dbd0e91afbe3e353bbced577cb0ed556dea..c797010762b14ed50eb8611e664cccbfee2dc428 100644 (file)
@@ -319,6 +319,16 @@ (defun parse-declarator (scanner base-type &key kernel abstractp)
    permitted.  In this case, you must ensure that ABSTRACTP is true so that
    the appropriate heuristic can be applied.  As a convenience, if ABSTRACTP
    is true then `(? :id)' is used as the default KERNEL."
+
+  ;; This is a bit confusing.  This is a strangely-shaped operator grammer,
+  ;; which wouldn't be so bad, but the `values' being operated on are pairs
+  ;; of the form (FUNC . NAME).  The NAME is whatever the KERNEL parser
+  ;; produces as its result, and will be passed out unchanged.  The FUNC is a
+  ;; type-constructor function which will be eventually be applied to the
+  ;; input BASE-TYPE, but we can't calculate the actual result as we go along
+  ;; because of the rather annoying inside-out nature of the declarator
+  ;; syntax.
+
   (with-parser-context (token-scanner-context :scanner scanner)
     (let ((kernel-parser (cond (kernel kernel)
                               (abstractp (parser () (? :id)))