mirror of
https://github.com/rui314/chibicc
synced 2025-02-18 14:44:16 +03:00
Add character literal
This commit is contained in:
parent
44bba965cb
commit
aa0accc75e
10
test/literal.c
Normal file
10
test/literal.c
Normal file
@ -0,0 +1,10 @@
|
||||
#include "test.h"
|
||||
|
||||
int main() {
|
||||
ASSERT(97, 'a');
|
||||
ASSERT(10, '\n');
|
||||
ASSERT(-128, '\x80');
|
||||
|
||||
printf("OK\n");
|
||||
return 0;
|
||||
}
|
27
tokenize.c
27
tokenize.c
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user