Add character literal

This commit is contained in:
Rui Ueyama 2019-08-11 16:27:43 +09:00
parent 44bba965cb
commit aa0accc75e
2 changed files with 37 additions and 0 deletions

10
test/literal.c Normal file
View File

@ -0,0 +1,10 @@
#include "test.h"
int main() {
ASSERT(97, 'a');
ASSERT(10, '\n');
ASSERT(-128, '\x80');
printf("OK\n");
return 0;
}

View File

@ -219,6 +219,26 @@ static Token *read_string_literal(char *start) {
return tok;
}
static Token *read_char_literal(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, start, end + 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))
@ -287,6 +307,13 @@ static Token *tokenize(char *filename, char *p) {
continue;
}
// Character literal
if (*p == '\'') {
cur = cur->next = read_char_literal(p);
p += cur->len;
continue;
}
// Identifier or keyword
if (is_ident1(*p)) {
char *start = p;