From 19b816b032dfc01a49f7f86ae7c411a0f15fd2bc Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Mon, 16 Mar 2020 02:04:47 -0700 Subject: scan: Keep track of whether tokens had preceeding whitespace --- cc.h | 2 ++ scan.c | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/cc.h b/cc.h index 05459e1..d938ade 100644 --- a/cc.h +++ b/cc.h @@ -121,6 +121,8 @@ struct location { struct token { enum tokenkind kind; + /* whether or not the token was preceeded by a space */ + _Bool space; struct location loc; char *lit; }; diff --git a/scan.c b/scan.c index ef2a2ca..557b595 100644 --- a/scan.c +++ b/scan.c @@ -16,6 +16,7 @@ struct buffer { struct scanner { int chr; bool usebuf; + bool sawspace; FILE *file; struct location loc; struct buffer buf; @@ -249,7 +250,7 @@ comment(struct scanner *s) case '/': /* C++-style comment */ do nextchar(s); while (s->chr != '\n' && s->chr != EOF); - return true; + break; case '*': /* C-style comment */ nextchar(s); do { @@ -259,10 +260,12 @@ comment(struct scanner *s) error(&s->loc, "EOF in comment"); } while (last != '*' || s->chr != '/'); nextchar(s); - return true; + break; default: return false; } + s->sawspace = true; + return true; } static int @@ -277,6 +280,7 @@ again: case '\t': case '\f': case '\v': + s->sawspace = true; nextchar(s); goto again; case '!': @@ -451,6 +455,7 @@ scanclose(void) void scan(struct token *t) { + scanner->sawspace = false; for (;;) { t->loc = scanner->loc; t->kind = scankind(scanner); @@ -466,4 +471,5 @@ scan(struct token *t) } else { t->lit = NULL; } + t->space = scanner->sawspace; } -- cgit v1.2.3