nyacc: starting to work on reframing
[mes.git] / module / nyacc / lang / c99 / body.scm
index 462fb82fae707887df9bf19e8e7b9f1775b78928..a01a4d7a23323f54900e2846e71b2c9f2dc177c7 100644 (file)
   (if (not (eq? ch #\#)) #f
       (let iter ((cl '()) (ch (read-char)))
        (cond
+        ((eof-object? ch) (throw 'cpp-error "CPP lines must end in newline"))
         ((eq? ch #\newline) (unread-char ch) (list->string (reverse cl)))
         ((eq? ch #\\)
          (let ((c2 (read-char)))
        ;; Return the first (tval . lval) pair not excluded by the CPP.
        (lambda ()
 
-         (define (exec-cpp-stmts?)     ; exec (vs pass to parser) CPP stmts?
+         (define (exec-cpp-stmts?) ; exec (vs pass to parser) CPP stmts?
            (eqv? mode 'code))
       
          (define (add-define tree)
            
          (define (eval-cpp-stmt stmt)
            (case (car stmt)
+             ;; includes
              ((include)
               (let* ((parg (cadr stmt)) (leng (string-length parg))
                      (file (substring parg 1 (1- leng)))
              ((undef)
               (rem-define (cadr stmt))
               (if (exec-cpp-stmts?) (set! ppxs (cons 'skip1-pop ppxs))))
+             ((error)
+              (if (exec-cpp-stmts?)
+                  (report-error "error: #error ~A" (cdr stmt))))
+             ((pragma) ;; std: implementation-defined if expanded
+              #t)
+
+             ;; control flow
              ((if) ;; covers (if ifdef ifndef)
               (cond
                ((exec-cpp-stmts?)
                 (let ((val (eval-cpp-cond-text (cadr stmt))))
+                  (simple-format #t "if ~S=> ~S\n" (cadr stmt) val)
                   (cond
                    ((not val) (p-err "unresolved: ~S" (cadr stmt)))
                    ((zero? val) (set! ppxs (cons* 'skip1-pop 'skip-look ppxs)))
                ((exec-cpp-stmts?)
                 (set! ppxs (cons 'skip1-pop (cdr ppxs))))
                (else (cpi-pop))))
-             ((error)
-              (if (exec-cpp-stmts?)
-                  (report-error "error: #error ~A" (cdr stmt))))
-             ((pragma)
-              ;; standard says implementation-defined if line is expanded
-              #t)
+
              (else
               (error "unhandled cpp stmt")))
            (case (car stmt)
              (else (cons 'cpp-stmt stmt))))
          
          (define (eval-cpp-line line)
+           ;;(simple-format #t "eval-cpp-line: ~S\n" line)
            (with-throw-handler
             'cpp-error
             (lambda () (eval-cpp-stmt (read-cpp-stmt line)))
               (throw 'c99-error "CPP error"))))
 
          ;; Composition of @code{read-cpp-line} and @code{eval-cpp-line}.
+         ;; We should not be doing this!
          (define (read-cpp ch)
            (and=> (read-cpp-line ch) eval-cpp-line))
 
                 ((read-comm ch bol) => assc-$)
                 ((read-cpp ch) =>
                  (lambda (res) ;; if '() stmt expanded so re-read
+                   ;;(simple-format #t "read-cpp => ~S\n" res)
                    (if (pair? res) (assc-$ res) (iter (read-char)))))
                 (else (set! bol #f) (iter ch))))
               ((read-ident ch) =>
                (lambda (name)
+                 ;;(simple-format #t "read-ident=>~S\n" name)
                  (let ((symb (string->symbol name)))
                    (cond
                     ((and (x-def? name mode)
                           (expand-cpp-mref name (cpi-defs info)))
                      => (lambda (st)
+                          ;;(simple-format #t "body: st=~S\n" st)
                           (push-input (open-input-string st))
                           (iter (read-char))))
                     ((assq-ref keytab symb)
          ;; Loop between reading tokens and skipping tokens via CPP logic.
          (let iter ((pair (read-token)))
            (case (car ppxs)
-             ((keep) pair)
+             ((keep)
+              ;;(simple-format #t "lx=>~S\n" pair)
+              pair)
              ((skip-done skip-look)
               (iter (read-token)))
              ((skip1-pop)