fixed topological sorting
This commit is contained in:
parent
597efe5791
commit
eed0f40516
3 changed files with 48 additions and 22 deletions
|
|
@ -1,19 +1,11 @@
|
||||||
import std;
|
|
||||||
|
|
||||||
struct b {
|
struct b {
|
||||||
a b,
|
a ciao,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct c {
|
struct c {
|
||||||
u32 b,
|
u32 test,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct a {
|
struct a {
|
||||||
c b,
|
c hello,
|
||||||
}
|
|
||||||
|
|
||||||
i32 main(i32 argc, [*[*u8]] argv)
|
|
||||||
{
|
|
||||||
print("Hello world!\n");
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
54
sema.c
54
sema.c
|
|
@ -12,6 +12,8 @@ typedef struct _res_node {
|
||||||
|
|
||||||
typedef struct { res_node node; bool complete; } pair;
|
typedef struct { res_node node; bool complete; } pair;
|
||||||
|
|
||||||
|
typedef struct { u8 flags; char *name; } type_key;
|
||||||
|
|
||||||
static struct { char *key; pair *value; } *types;
|
static struct { char *key; pair *value; } *types;
|
||||||
static struct { char *key; type *value; } *type_reg;
|
static struct { char *key; type *value; } *type_reg;
|
||||||
|
|
||||||
|
|
@ -32,6 +34,7 @@ static char *intern_string(sema *s, char *str, usize len)
|
||||||
static type *create_integer(sema *s, char *name, u8 bits, bool sign)
|
static type *create_integer(sema *s, char *name, u8 bits, bool sign)
|
||||||
{
|
{
|
||||||
type *t = arena_alloc(s->allocator, sizeof(type));
|
type *t = arena_alloc(s->allocator, sizeof(type));
|
||||||
|
t->name = name;
|
||||||
t->tag = sign ? TYPE_INTEGER : TYPE_UINTEGER;
|
t->tag = sign ? TYPE_INTEGER : TYPE_UINTEGER;
|
||||||
t->data.integer = bits;
|
t->data.integer = bits;
|
||||||
|
|
||||||
|
|
@ -47,6 +50,7 @@ static type *create_integer(sema *s, char *name, u8 bits, bool sign)
|
||||||
static type *create_float(sema *s, char *name, u8 bits)
|
static type *create_float(sema *s, char *name, u8 bits)
|
||||||
{
|
{
|
||||||
type *t = arena_alloc(s->allocator, sizeof(type));
|
type *t = arena_alloc(s->allocator, sizeof(type));
|
||||||
|
t->name = name;
|
||||||
t->tag = TYPE_FLOAT;
|
t->tag = TYPE_FLOAT;
|
||||||
t->data.flt = bits;
|
t->data.flt = bits;
|
||||||
|
|
||||||
|
|
@ -69,42 +73,51 @@ static void order_type(sema *s, ast_node *node)
|
||||||
t->data.structure.name_len = node->expr.structure.name_len;
|
t->data.structure.name_len = node->expr.structure.name_len;
|
||||||
t->data.structure.members = node->expr.structure.members;
|
t->data.structure.members = node->expr.structure.members;
|
||||||
|
|
||||||
pair *graph_node = shget(types, intern_string(s, node->expr.structure.name, node->expr.structure.name_len));
|
char *k = intern_string(s, node->expr.structure.name, node->expr.structure.name_len);
|
||||||
|
t->name = k;
|
||||||
|
pair *graph_node = shget(types, k);
|
||||||
|
|
||||||
if (!graph_node) {
|
if (!graph_node) {
|
||||||
graph_node = arena_alloc(s->allocator, sizeof(pair));
|
graph_node = arena_alloc(s->allocator, sizeof(pair));
|
||||||
graph_node->node.value = t;
|
|
||||||
graph_node->node.in = NULL;
|
graph_node->node.in = NULL;
|
||||||
graph_node->node.out = NULL;
|
graph_node->node.out = NULL;
|
||||||
} else {
|
|
||||||
graph_node->complete = true;
|
|
||||||
}
|
}
|
||||||
|
graph_node->node.value = t;
|
||||||
|
|
||||||
member *m = t->data.structure.members;
|
member *m = t->data.structure.members;
|
||||||
while (m) {
|
while (m) {
|
||||||
char *name = intern_string(s, m->name, m->name_len);
|
if (m->type->type != NODE_IDENTIFIER) {
|
||||||
|
m = m->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
char *name = intern_string(s, m->type->expr.string.start, m->type->expr.string.len);
|
||||||
pair *p = shget(types, name);
|
pair *p = shget(types, name);
|
||||||
if (!p) {
|
if (!p) {
|
||||||
p = arena_alloc(s->allocator, sizeof(pair));
|
p = arena_alloc(s->allocator, sizeof(pair));
|
||||||
p->complete = false;
|
|
||||||
p->node.out = NULL;
|
p->node.out = NULL;
|
||||||
p->node.in = NULL;
|
p->node.in = NULL;
|
||||||
|
p->node.value = NULL;
|
||||||
shput(types, name, p);
|
shput(types, name, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
arrput(p->node.in, &graph_node->node);
|
arrput(graph_node->node.in, &p->node);
|
||||||
arrput(graph_node->node.out, &p->node);
|
arrput(p->node.out, &graph_node->node);
|
||||||
|
|
||||||
m = m->next;
|
m = m->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
shput(types, intern_string(s, t->data.structure.name, t->data.structure.name_len), graph_node);
|
shput(types, k, graph_node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void register_struct(sema *s, char *name, type *t)
|
static void register_struct(sema *s, char *name, type *t)
|
||||||
{
|
{
|
||||||
|
usize alignment = 0;
|
||||||
|
member *m = t->data.structure.members;
|
||||||
|
while (m) {
|
||||||
|
//if (alignment < m->
|
||||||
|
m = m->next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void register_union(sema *s, char *name, type *t)
|
static void register_union(sema *s, char *name, type *t)
|
||||||
|
|
@ -145,6 +158,26 @@ end:
|
||||||
current = current->expr.unit_node.next;
|
current = current->expr.unit_node.next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//printf("digraph G {\n");
|
||||||
|
|
||||||
|
//for (int i=0; i < shlen(types); i++) {
|
||||||
|
// pair *p = types[i].value;
|
||||||
|
// res_node *n = &p->node;
|
||||||
|
// type *t = n->value;
|
||||||
|
// char *name = t->name;
|
||||||
|
// for (int j=0; j < arrlen(n->out); j++) {
|
||||||
|
// type *t1 = n->out[j]->value;
|
||||||
|
// if (t1)
|
||||||
|
// printf("%s->%s [color=\"red\"];\n", name, t1->name);
|
||||||
|
// }
|
||||||
|
// for (int j=0; j < arrlen(n->in); j++) {
|
||||||
|
// type *t1 = n->in[j]->value;
|
||||||
|
// if (t1)
|
||||||
|
// printf("%s->%s [color=\"blue\"];\n", name, t1->name);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//printf("}\n");
|
||||||
|
|
||||||
res_node **nodes = NULL;
|
res_node **nodes = NULL;
|
||||||
res_node **ordered = NULL;
|
res_node **ordered = NULL;
|
||||||
for (int i=0; i < shlen(types); i++) {
|
for (int i=0; i < shlen(types); i++) {
|
||||||
|
|
@ -177,6 +210,7 @@ end:
|
||||||
type *t = ordered[i]->value;
|
type *t = ordered[i]->value;
|
||||||
if (t && (t->tag == TYPE_STRUCT || t->tag == TYPE_UNION)) {
|
if (t && (t->tag == TYPE_STRUCT || t->tag == TYPE_UNION)) {
|
||||||
char *name = intern_string(s, t->data.structure.name, t->data.structure.name_len);
|
char *name = intern_string(s, t->data.structure.name, t->data.structure.name_len);
|
||||||
|
printf("%s\n", name);
|
||||||
register_type(s, name, t);
|
register_type(s, name, t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2
sema.h
2
sema.h
|
|
@ -21,13 +21,13 @@ typedef struct _type {
|
||||||
type_tag tag;
|
type_tag tag;
|
||||||
usize size;
|
usize size;
|
||||||
usize alignment;
|
usize alignment;
|
||||||
|
char *name;
|
||||||
union {
|
union {
|
||||||
u8 integer;
|
u8 integer;
|
||||||
u8 flt; // float
|
u8 flt; // float
|
||||||
struct {
|
struct {
|
||||||
bool is_const;
|
bool is_const;
|
||||||
bool is_volatile;
|
bool is_volatile;
|
||||||
u16 alignment;
|
|
||||||
struct _type *child;
|
struct _type *child;
|
||||||
} ptr;
|
} ptr;
|
||||||
struct {
|
struct {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue