diff options
author | Hugo Hörnquist <hugo@lysator.liu.se> | 2022-07-12 03:16:34 +0200 |
---|---|---|
committer | Hugo Hörnquist <hugo@lysator.liu.se> | 2022-07-12 03:16:34 +0200 |
commit | 65ecaf18aa34d3e76abbfd757797fa4dda9bb195 (patch) | |
tree | 1e7294a4a6fce2bc5a121162b6e0101e70ce1c3f /module/c/preprocessor2.scm | |
parent | s/macro?/cpp-macro?/g (diff) | |
download | calp-65ecaf18aa34d3e76abbfd757797fa4dda9bb195.tar.gz calp-65ecaf18aa34d3e76abbfd757797fa4dda9bb195.tar.xz |
Resolve # ## #
Diffstat (limited to '')
-rw-r--r-- | module/c/preprocessor2.scm | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/module/c/preprocessor2.scm b/module/c/preprocessor2.scm index 3cb5913f..4678ded7 100644 --- a/module/c/preprocessor2.scm +++ b/module/c/preprocessor2.scm @@ -26,7 +26,8 @@ (define parameter-map? (of-type? (alist-of string? (list-of lexeme?)))) -(define (concat-token? token) (equal? "##" (punctuator-token? token))) +(define (concat-token? token) (and (equal? "##" (punctuator-token? token)) + (not (member "##" (lexeme-noexpand token))))) (define (stringify-token? token) (equal? "#" (punctuator-token? token))) (define (left-parenthesis-token? token) (equal? "(" (punctuator-token? token))) (define (right-parenthesis-token? token) (equal? ")" (punctuator-token? token))) @@ -90,8 +91,15 @@ (loop (cdr l) r)) ((placemaker-token? (car r)) (loop (cdr l) (cons (car l) (cdr r)))) - (else (loop (cdr l) (cons (concatenate-tokens (car l) (car r)) - (cdr r))))))) + (else + ;; 6.10.3.3 p. 3 + ;; I believe that ## is the only special case where the + ;; result of concatenation is differente from the token directly. + (let ((token (concatenate-tokens (car l) (car r)))) + (let ((token (if (concat-token? token) + (modify token lexeme-noexpand xcons "##") + token))) + (loop (cdr l) (cons token (cdr r))))))))) (else (let ((pre post (break concat-token? right))) (loop (append left (reverse pre)) post)))))) |