feat: 数组类型语法 [T; N] 改为 T[N] 后置语法
This commit is contained in:
+22
-23
@@ -282,32 +282,12 @@ static TypeKind token_to_type(TokenKind k) {
|
||||
}
|
||||
|
||||
// === 类型表达式解析(内置类型/结构体名/数组类型)===
|
||||
// 数组支持后置语法: T[N], T[N][M] 等
|
||||
static TypeInfo parse_type_expr(Parser* p, ErrorInfo* error) {
|
||||
const Token* t = peek(p);
|
||||
|
||||
// 数组类型: [element_type; size]
|
||||
if (t->kind == TOK_LBRACKET) {
|
||||
advance(p); // 跳过 '['
|
||||
TypeInfo elem = parse_type_expr(p, error);
|
||||
if (elem.kind == TYPE_ERROR) return elem;
|
||||
if (!expect(p, TOK_SEMICOLON, error, "数组类型中缺少 ';'")) {
|
||||
TypeInfo ti = {0}; ti.kind = TYPE_ERROR; return ti;
|
||||
}
|
||||
const Token* size_tok = expect(p, TOK_INT_LIT, error, "数组大小必须是整数常量");
|
||||
if (!size_tok) { TypeInfo ti = {0}; ti.kind = TYPE_ERROR; return ti; }
|
||||
int64_t size = tok_int_value(size_tok);
|
||||
if (!expect(p, TOK_RBRACKET, error, "缺少 ']'")) {
|
||||
TypeInfo ti = {0}; ti.kind = TYPE_ERROR; return ti;
|
||||
}
|
||||
TypeInfo ti = {0};
|
||||
ti.kind = TYPE_ARRAY;
|
||||
ti.element_type = elem.kind;
|
||||
ti.element_struct_name = elem.struct_name;
|
||||
ti.array_size = size;
|
||||
return ti;
|
||||
}
|
||||
|
||||
TypeInfo ti = {0};
|
||||
|
||||
// 解析基础类型
|
||||
if (tok_is_type(t->kind)) {
|
||||
advance(p);
|
||||
ti.kind = token_to_type(t->kind);
|
||||
@@ -319,7 +299,26 @@ static TypeInfo parse_type_expr(Parser* p, ErrorInfo* error) {
|
||||
error->message = "无效的类型"; error->filename = p->filename;
|
||||
error->line = t->line; error->col = t->col;
|
||||
ti.kind = TYPE_ERROR;
|
||||
return ti;
|
||||
}
|
||||
|
||||
// 后置数组维度: Type[N] → TYPE_ARRAY
|
||||
if (peek(p)->kind == TOK_LBRACKET) {
|
||||
advance(p); // 跳过 '['
|
||||
const Token* size_tok = expect(p, TOK_INT_LIT, error, "数组大小必须是整数常量");
|
||||
if (!size_tok) { ti.kind = TYPE_ERROR; return ti; }
|
||||
int64_t size = tok_int_value(size_tok);
|
||||
if (!expect(p, TOK_RBRACKET, error, "缺少 ']'")) {
|
||||
ti.kind = TYPE_ERROR; return ti;
|
||||
}
|
||||
TypeInfo arr_ti = {0};
|
||||
arr_ti.kind = TYPE_ARRAY;
|
||||
arr_ti.element_type = ti.kind;
|
||||
arr_ti.element_struct_name = ti.struct_name;
|
||||
arr_ti.array_size = size;
|
||||
return arr_ti;
|
||||
}
|
||||
|
||||
return ti;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user