feat: 新增 i32 / u64 / char 类型 + 字符字面量 "'a'"
This commit is contained in:
+26
-3
@@ -94,6 +94,21 @@ static AstNode* parse_literal(Parser* p) {
|
||||
switch (t->kind) {
|
||||
case TOK_INT_LIT: return ast_make_literal_i64(p->arena, tok_int_value(t), tok_loc(t));
|
||||
case TOK_FLOAT_LIT: return ast_make_literal_f64(p->arena, tok_float_value(t), tok_loc(t));
|
||||
case TOK_CHAR_LIT: {
|
||||
int64_t val = 0;
|
||||
if (t->length >= 2 && t->start[0] == '\\') {
|
||||
switch (t->start[1]) {
|
||||
case 'n': val = '\n'; break;
|
||||
case 't': val = '\t'; break;
|
||||
case '\\': val = '\\'; break;
|
||||
case '\'': val = '\''; break;
|
||||
default: val = t->start[1]; break;
|
||||
}
|
||||
} else {
|
||||
val = (unsigned char)t->start[0];
|
||||
}
|
||||
return ast_make_literal_char(p->arena, (int)val, tok_loc(t));
|
||||
}
|
||||
case TOK_TRUE: return ast_make_literal_bool(p->arena, true, tok_loc(t));
|
||||
case TOK_FALSE: return ast_make_literal_bool(p->arena, false, tok_loc(t));
|
||||
case TOK_STR_LIT: {
|
||||
@@ -204,6 +219,7 @@ static AstNode* parse_expr_prec(Parser* p, Precedence min_prec, ErrorInfo* error
|
||||
} else if (tok->kind == TOK_LPAREN) {
|
||||
left = parse_group(p, error);
|
||||
} else if (tok->kind == TOK_INT_LIT || tok->kind == TOK_FLOAT_LIT ||
|
||||
tok->kind == TOK_CHAR_LIT ||
|
||||
tok->kind == TOK_TRUE || tok->kind == TOK_FALSE ||
|
||||
tok->kind == TOK_STR_LIT) {
|
||||
left = parse_literal(p);
|
||||
@@ -276,9 +292,16 @@ static AstNode* parse_expr(Parser* p, ErrorInfo* error) {
|
||||
|
||||
// === 类型工具 ===
|
||||
static TypeKind token_to_type(TokenKind k) {
|
||||
switch (k) { case TOK_I64: return TYPE_I64; case TOK_F64: return TYPE_F64;
|
||||
case TOK_BOOL: return TYPE_BOOL; case TOK_STR: return TYPE_STR;
|
||||
default: return TYPE_VOID; }
|
||||
switch (k) {
|
||||
case TOK_I32: return TYPE_I32;
|
||||
case TOK_I64: return TYPE_I64;
|
||||
case TOK_U64: return TYPE_U64;
|
||||
case TOK_F64: return TYPE_F64;
|
||||
case TOK_BOOL: return TYPE_BOOL;
|
||||
case TOK_CHAR: return TYPE_CHAR;
|
||||
case TOK_STR: return TYPE_STR;
|
||||
default: return TYPE_VOID;
|
||||
}
|
||||
}
|
||||
|
||||
// === 类型表达式解析(内置类型/结构体名/数组类型)===
|
||||
|
||||
Reference in New Issue
Block a user