stage1 完成sema词法
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user