larpcc/resolve.c
2026-10-02 00:32:31 +02:00

94 lines
1.8 KiB
C

#include "resolve.h"
#include "ast.h"
#include "syms.h"
#include <stdio.h>
#include <stdlib.h>
struct Resolver {
Syms* ord_syms;
Syms* tag_syms;
Syms* label_syms;
bool in_typedef;
};
Resolver* resolver_new()
{
Resolver* r = malloc(sizeof(Resolver));
*r = (Resolver) {
.ord_syms = syms_new(),
.tag_syms = syms_new(),
.label_syms = syms_new(),
.in_typedef = false,
};
return r;
}
void resolver_free(Resolver* r)
{
syms_free(r->ord_syms);
syms_free(r->tag_syms);
syms_free(r->label_syms);
free(r);
}
static AstVisitorResult visit_stmt_block(AstVisitor* v, AstStmtBlock* node)
{
Resolver* r = v->op;
syms_push_scope(r->ord_syms);
ast_stmt_block_visit_body(v, node);
syms_pop_scope(r->ord_syms);
return AstVisitor_Break;
}
static AstVisitorResult visit_stmt(AstVisitor* v, AstStmt* node)
{
}
static AstVisitorResult visit_decl(AstVisitor* v, AstDecl* node)
{
Resolver* r = v->op;
}
static AstVisitorResult visit_declar(AstVisitor* v, AstDeclar* node)
{
Resolver* r = v->op;
if (node->ty == AstDeclar_Function) {
syms_push_scope(r->ord_syms);
ast_declar_visit_body(v, node);
syms_pop_scope(r->ord_syms);
return AstVisitor_Break;
}
if (node->ty == AstDeclar_Ident) { }
}
static AstVisitorResult visit_expr(AstVisitor* v, AstExpr* node)
{
}
void resolver_resolve_top_stmt(Resolver* r, AstStmt* stmt)
{
if (stmt->ty != AstStmt_Decl) {
fprintf(
stderr, "error: expected declaration on line %d\n", stmt->loc.line);
exit(1);
}
AstVisitor v = {
.visit_stmt_block = visit_stmt_block,
.visit_stmt = visit_stmt,
.visit_decl = visit_decl,
.visit_declar = visit_declar,
.visit_expr = visit_expr,
.op = r,
};
visit_stmt(&v, stmt);
}