#include "resolve.h" #include "ast.h" #include "syms.h" #include #include 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); }