(define-module (c compiler) :use-module ((c lex2) :select (lex)) :use-module ((c trigraph) :select (replace-trigraphs)) :use-module ((c line-fold) :select (fold-lines)) :use-module (hnh util) :export (run-compiler)) (define (comment->whitespace expr) (match expr (('comment _) '(whitespace " ")) (other other))) " #define __STDC__ 1 #define __STDC_HOSTED__ 1 #define __STDC_VERSION__ 201112L " (define now (localtime (current-time))) (define default-macros (list ;; 6.10.8 (object-like-macro identifier: "__STDC__" body: '(preprocessing-token (pp-number "1"))) (object-like-macro identifier: "__STDC_HOSTED__" body: '(preprocessing-token (pp-number "1"))) (object-like-macro identifier: "__STDC_VERSION__" body: '(preprocessing-token (pp-number "201112L"))) (object-like-macro identifier: "__DATE__" ;; TODO format should always be in ;; english, and not tranlated body: `(preprocessing-token (string-literal ,(strftime "%b %_d %Y" now)))) (object-like-macro identifier: "__TIME__" body: (preprocessing-token (string-literal ,(strftime "%H:%M:%S" now)))))) (define environment (-> (make-environment) (extend-environment default-macros))) (define (read-file path) (call-with-input-file path read-string)) ;;; 5.1.11.2 Translation phases (define (run-compiler path) (define environment (enter-file (make-environment) path)) (-> (load-and-tokenize-file path) (handle-preprocessing-tokens environment)) ;;; 5. (something with character sets) ;;; 6. concatenation of string literals ;;; 7. Whitespace tokens are discarded, each preprocessing token is converted into a token ;; 6.4 paragraph 2 ;; Each preprocessing toket thas is converted to a token shall have the lexcal form of a keyword, an identifier, a constant, a string literal, or a puncturtor ;;; 8. All external objects and functions are resolved )