nyacc: fixed C99 use of 'defined XYZ' (no parens)
authorMatt Wette <matt.wette@gmail.com>
Wed, 11 Jan 2017 04:06:28 +0000 (20:06 -0800)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 11 Jan 2017 04:06:28 +0000 (20:06 -0800)
module/nyacc/lang/c99/cpp.scm
module/nyacc/lang/c99/cppbody.scm
module/nyacc/lang/c99/mach.scm

index 32fc15304b6fe9ff12f8336af8caf164d048660d..3ae3b9f87aae94a4ef27ca8884f6719f888a2334 100644 (file)
@@ -47,14 +47,6 @@ todo:
   provide util to expand defines
 |#
 
-;;.@deffn skip-ws ch
-;; Helper for 
-(define (skip-ws ch)
-  (if (eof-object? ch) ch
-      (if (char-set-contains? c:ws ch)
-         (skip-ws (read-char))
-         ch)))
-
 ;; @deffn read-ellipsis ch
 ;; read ellipsis
 (define (read-ellipsis ch)
index 1b0076538ee7a0126f5d8a8236717635c1c28d6b..18db91e8a2154ce07a2236132c01e61f3d49fe6b 100644 (file)
 (define (cpp-err fmt . args)
   (apply throw 'cpp-error fmt args))
 
+;;.@deffn skip-ws ch
+(define (skip-ws ch)
+  (if (eof-object? ch) ch
+      (if (char-set-contains? c:ws ch)
+         (skip-ws (read-char))
+         ch)))
+
 ;; Since we want to be able to get CPP statements with comment in tact
 ;; (e.g., for passing to @code{pretty-print-c99}) we need to remove
 ;; comments when parsing CPP expressions.  We convert a comm-reader
   (define (add-chl chl stl)
     (if (null? chl) stl (cons (list->string (reverse chl)) stl)))
 
-  ;; We just scanned "defined", not need to scan the arg to inhibit expansion.
-  ;; E.g., scanned "defined", now scan "(FOO)", and return "defined(FOO)".
+  ;; We just scanned "defined", now need to scan the arg to inhibit expansion.
+  ;; For example, we have scanned "defined"; we now scan "(FOO)" or "FOO", and
+  ;; return "defined(FOO)".  We use ec (end-char) as state indicator: nul at
+  ;; start, #\) on seeing #\( or #\space if other.
   (define (scan-defined)
-    (let iter ((chl '()) (ch (read-char)))
-      (cond ((eof-object? ch) (cpp-err "bad CPP defined"))
-           ((char=? #\) ch)
-            (string-append "defined" (list->string (reverse (cons ch chl)))))
-           (else (iter (cons ch chl) (read-char))))))
-  
-  ;; 
+    (let* ((ch (skip-ws (read-char))) (ec (if (char=? ch #\() #\) #\space)))
+      (let iter ((chl '(#\()) (ec ec) (ch ch))
+       (cond
+        ((and (eof-object? ch) (char=? #\space ec))
+         (string-append "defined" (list->string (reverse (cons #\) chl)))))
+        ((eof-object? ch) (cpp-err "illegal argument to `defined'"))
+        ((and (char=? ch #\)) (char=? ec #\)))
+         (string-append "defined" (list->string (reverse (cons ch chl)))))
+        ((char-set-contains? c:ir ch)
+         (iter (cons ch chl) ec (read-char)))
+        (else (cpp-err "illegal identifier"))))))
+
   (let iter ((stl '())         ; string list (i.e., tokens)
             (chl '())          ; char-list (current list of input chars)
             (nxt #f)           ; next string 
index cac0e46b73f3170460bbe27eb045a8e0c7b733fa..669a2d4dd1aa5da67e3bf1c8ec9e909178297cb5 100644 (file)
 
     ;; external definitions
     (translation-unit                  ; S 6.9
-     (external-declaration-list ($$ (tl->list $1))))
+     (external-declaration-list ($$ (tl->list $1)))
      )
     (external-declaration-list
      (external-declaration ($$ (make-tl 'trans-unit $1)))