diff --git a/test/literal.c b/test/literal.c new file mode 100644 index 0000000000000000000000000000000000000000..fd3ccf971da87d79b1c2df19ff0978eb78d9268f --- /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 1d9756883b0215b65e1a60a70d5d870fe13ddede..eb7715fabd404a81474be63d7be1bfaf04235c8f 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++;