From acabd99ee4195dac5083bfc2cbfd3bc58b4ec7c5 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Sun, 11 Aug 2019 16:27:43 +0900 Subject: [PATCH] Add character literal --- test/literal.c | 10 ++++++++++ tokenize.c | 27 +++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 test/literal.c diff --git a/test/literal.c b/test/literal.c new file mode 100644 index 0000000..fd3ccf9 --- /dev/null +++ b/test/literal.c @@ -0,0 +1,10 @@ +#include "test.h" + +int main() { + ASSERT(97, 'a'); + ASSERT(10, '\n'); + ASSERT(-128, '\x80'); + + printf("OK\n"); + return 0; +} diff --git a/tokenize.c b/tokenize.c index 1d97568..eb7715f 100644 --- a/tokenize.c +++ b/tokenize.c @@ -205,6 +205,26 @@ static Token *read_string_literal(Token *cur, char *start) { return tok; } +static Token *read_char_literal(Token *cur, char *start) { + char *p = start + 1; + if (*p == '\0') + error_at(start, "unclosed char literal"); + + char c; + if (*p == '\\') + c = read_escaped_char(&p, p + 1); + else + c = *p++; + + char *end = strchr(p, '\''); + if (!end) + error_at(p, "unclosed char literal"); + + Token *tok = new_token(TK_NUM, cur, start, end - start + 1); + tok->val = c; + return tok; +} + static void convert_keywords(Token *tok) { for (Token *t = tok; t->kind != TK_EOF; t = t->next) if (is_keyword(t)) @@ -273,6 +293,13 @@ static Token *tokenize(char *filename, char *p) { continue; } + // Character literal + if (*p == '\'') { + cur = read_char_literal(cur, p); + p += cur->len; + continue; + } + // Identifier or keyword if (is_ident1(*p)) { char *q = p++; -- GitLab