94 lines
1.8 KiB
C
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);
|
|
}
|