stage1 完成sema词法

This commit is contained in:
zzy
2026-08-04 10:20:57 +08:00
parent 74d7376039
commit 8ac59dfaa1
14 changed files with 2309 additions and 47 deletions

View File

@@ -151,10 +151,7 @@ static void parse_error(parser_t *p, spl_tok_t *t, const char *msg) {
const char *fn = (t && t->fname) ? t->fname : "<unknown>";
usize line = t ? t->line : 0;
usize col = t ? t->col : 0;
fprintf(stderr, "%s:%llu:%llu: error: %s\n", fn, (unsigned long long)line,
(unsigned long long)col, msg);
fflush(stderr);
abort();
LOG_FATAL("%s:%llu:%llu: error: %s", fn, (unsigned long long)line, (unsigned long long)col, msg);
}
static int expect(parser_t *p, spl_tok_type_t type, const char *what) {
@@ -1383,7 +1380,8 @@ static spl_ast_node_ref_t parse_postfix(parser_t *p) {
}
} else if (t->type == TOK_L_BRACKET) {
advance(p);
spl_ast_node_ref_t begin = parse_expr(p);
/* 切片 begin 用 parse_shift 解析:`a..b` 中 `..` 属切片标记而非 Range 表达式 */
spl_ast_node_ref_t begin = parse_shift(p);
if (peek(p) && peek(p)->type == TOK_RANGE) {
advance(p);
spl_ast_node_ref_t end = 0;
@@ -1529,7 +1527,8 @@ static spl_ast_node_ref_t parse_primary(parser_t *p) {
/* 结构体字面量 T { .f1 = e1, ... } */
spl_ast_node_ref_vec_t agg_vec = parse_aggregate_init_body(p);
spl_ast_node_ref_t pr = mk_primary(p, t, SPL_AST_ARGGREGATE_INIT);
node_at(p->ast, pr)->primary_expr.aggregate_init_expr = agg_vec;
node_at(p->ast, pr)->primary_expr.aggregate_init.name = sdupn(t->lexeme, t->len);
node_at(p->ast, pr)->primary_expr.aggregate_init.expr = agg_vec;
return wrap_expr(p, pr);
}
spl_ast_node_ref_t pr = mk_primary(p, t, SPL_AST_IDENT);
@@ -1543,7 +1542,8 @@ static spl_ast_node_ref_t parse_primary(parser_t *p) {
advance(p);
spl_ast_node_ref_vec_t agg_vec = parse_aggregate_init_body(p);
spl_ast_node_ref_t pr = mk_primary(p, t, SPL_AST_ARGGREGATE_INIT);
node_at(p->ast, pr)->primary_expr.aggregate_init_expr = agg_vec;
node_at(p->ast, pr)->primary_expr.aggregate_init.name = NULL;
node_at(p->ast, pr)->primary_expr.aggregate_init.expr = agg_vec;
return wrap_expr(p, pr);
}
parse_error(p, t, "unexpected '.' in expression");
@@ -2132,10 +2132,8 @@ static void expr_inline(spl_ast_t *ast, spl_ast_node_ref_t ref, char *out, size_
snprintf(tmp, sizeof tmp, "%s", STR(pn->primary_expr.ident));
break;
case SPL_AST_ARGGREGATE_INIT:
tmp[0] = '{';
tmp[1] = ' ';
tmp[2] = '\0';
agg_items_inline(ast, &pn->primary_expr.aggregate_init_expr, tmp, sizeof tmp);
snprintf(tmp, sizeof tmp, "%s{ ", STR(pn->primary_expr.aggregate_init.name));
agg_items_inline(ast, &pn->primary_expr.aggregate_init.expr, tmp, sizeof tmp);
strncat(tmp, " }", sizeof tmp - strlen(tmp) - 1);
break;
case SPL_AST_EXPR_EXPR:
@@ -2480,11 +2478,11 @@ static void dump_primary_expr(spl_ast_t *ast, spl_ast_node_ref_t ref, const char
node_label(prefix, is_last, "Ident %s", STR(n->primary_expr.ident));
break;
case SPL_AST_ARGGREGATE_INIT:
node_label(prefix, is_last, "AggInit");
node_label(prefix, is_last, "AggInit %s", STR(n->primary_expr.aggregate_init.name));
spl_dumptree_child_prefix(dt, prefix, is_last, cp, sizeof cp);
for (usize i = 0; i < n->primary_expr.aggregate_init_expr.size; i++) {
spl_ast_node_t *it = &ast->buckets.data[n->primary_expr.aggregate_init_expr.data[i]];
int it_last = (int)(i == n->primary_expr.aggregate_init_expr.size - 1);
for (usize i = 0; i < n->primary_expr.aggregate_init.expr.size; i++) {
spl_ast_node_t *it = &ast->buckets.data[n->primary_expr.aggregate_init.expr.data[i]];
int it_last = (int)(i == n->primary_expr.aggregate_init.expr.size - 1);
node_label(cp, it_last, "Field .%s", STR(it->aggregate_init_item.ident));
if (it->aggregate_init_item.expr) {
char cq[512];
@@ -3153,7 +3151,8 @@ static void drop_node(spl_ast_t *ast, spl_ast_node_ref_t ref, walk_ctx_t ctx) {
free((void *)n->primary_expr.string_lit_expr);
break;
case SPL_AST_ARGGREGATE_INIT:
drop_vec(ast, &n->primary_expr.aggregate_init_expr, CTX_AGG_ITEM);
free((void *)n->primary_expr.aggregate_init.name);
drop_vec(ast, &n->primary_expr.aggregate_init.expr, CTX_AGG_ITEM);
break;
case SPL_AST_EXPR_EXPR:
drop_node(ast, n->primary_expr.expr, CTX_EXPR);
@@ -3382,7 +3381,7 @@ static void validate_node(spl_ast_t *ast, spl_ast_node_ref_t ref, walk_ctx_t ctx
printf("valid: identifier missing name\n");
break;
case SPL_AST_ARGGREGATE_INIT:
validate_vec(ast, &n->primary_expr.aggregate_init_expr, CTX_AGG_ITEM);
validate_vec(ast, &n->primary_expr.aggregate_init.expr, CTX_AGG_ITEM);
break;
case SPL_AST_EXPR_EXPR:
validate_node(ast, n->primary_expr.expr, CTX_EXPR);