More parsing of expressions

This commit is contained in:
Krzosa Karol
2022-05-06 21:58:09 +02:00
parent 76a8cc779c
commit 501e42be19
6 changed files with 661 additions and 267 deletions

179
new_ast.c
View File

@@ -4,6 +4,7 @@ typedef struct Decl Decl;
typedef struct Stmt Stmt;
typedef struct Stmt_If Stmt_If;
typedef struct Typespec Typespec;
typedef struct Typespec_Function_Arg Typespec_Function_Arg;
typedef struct Decl_Enum_Child Decl_Enum_Child;
typedef struct Decl_Function_Arg Decl_Function_Arg;
typedef struct Expr_Compound_Field Expr_Compound_Field;
@@ -130,15 +131,20 @@ typedef enum Typespec_Kind{
TS_Pointer,
TS_Array,
TS_Function,
TS_NamedArgument,
}Typespec_Kind;
struct Typespec{
Typespec_Kind kind;
Typespec *next;
Typespec_Kind kind;
Token *pos;
union{
Intern_String name;
Typespec *base;
Intern_String name;
struct{
Intern_String name;
Typespec *base;
}named;
struct{
Typespec *first;
Typespec *last;
@@ -165,15 +171,6 @@ typedef enum Decl_Kind{
DECL_List,
}Decl_Kind;
struct Note{
Token *pos;
Intern_String name;
Expr *expr;
Note *next;
Note *first;
Note *last;
};
struct Decl{
Decl_Kind kind;
Decl *next;
@@ -208,7 +205,7 @@ struct Decl{
Decl_Function_Arg *first;
Decl_Function_Arg *last;
Typespec *ret;
//Stmt *body;
Stmt *body;
}func_decl;
struct{
Decl *first;
@@ -217,6 +214,15 @@ struct Decl{
};
};
struct Note{
Token *pos;
Intern_String name;
Expr *expr;
Note *next;
Note *first;
Note *last;
};
struct Decl_Function_Arg{
Decl_Function_Arg *next;
Token *pos;
@@ -439,11 +445,148 @@ expr_compound_push(Expr *list, Expr_Compound_Field *field){
SLLQueuePush(list->compound.first, list->compound.last, field);
}
//-----------------------------------------------------------------------------
// Type specifier constructors
//-----------------------------------------------------------------------------
function Typespec *
typespec_new(Arena *p, Typespec_Kind kind, Token *pos){
Typespec *result = arena_push_struct(p, Typespec);
result->kind = kind;
result->pos = pos;
return result;
}
function Typespec *
typespec_name(Arena *p, Token *pos, Intern_String name){
Typespec *result = typespec_new(p, TS_Name, pos);
result->name = name;
return result;
}
function Typespec *
typespec_pointer(Arena *p, Token *pos, Typespec *base){
Typespec *result = typespec_new(p, TS_Pointer, pos);
result->base = base;
return result;
}
function Typespec *
typespec_array(Arena *p, Token *pos, Typespec *base, Expr *size){
Typespec *result = typespec_new(p, TS_Array, pos);
result->arr.base = base;
result->arr.size = size;
return result;
}
function Typespec *
typespec_function(Arena *p, Token *pos, Typespec *ret){
Typespec *result = typespec_new(p, TS_Function, pos);
result->func.ret = ret;
return result;
}
function Typespec *
typespec_named_argument(Arena *arena, Token *pos, Typespec *typespec, Intern_String name){
Typespec *result = typespec_new(arena, TS_NamedArgument, pos);
result->named.base = typespec;
result->named.name = name;
return result;
}
function void
typespec_function_push(Typespec *func, Typespec *arg){
SLLQueuePush(func->func.first, func->func.last, arg);
}
//-----------------------------------------------------------------------------
// Declarations
//-----------------------------------------------------------------------------
function Decl *
decl_new(Arena *p, Decl_Kind kind, Token *pos, Intern_String name){
Decl *result = arena_push_struct(p, Decl);
result->kind = kind;
result->pos = pos;
result->name = name;
return result;
}
function Decl *
decl_struct(Arena *p, Decl_Kind kind, Token *pos, Intern_String name){
assert(kind == DECL_Struct || kind == DECL_Union);
Decl *result = decl_new(p, kind, pos, name);
return result;
}
function Decl *
decl_typedef(Arena *p, Token *pos, Intern_String name, Typespec *type){
Decl *result = decl_new(p, DECL_Typedef, pos, name);
result->typedef_decl.type = type;
return result;
}
function Decl *
decl_enum(Arena *p, Token *pos, Intern_String name, Typespec *typespec){
Decl *result = decl_new(p, DECL_Enum, pos, name);
result->enum_decl.typespec = typespec;
return result;
}
function Decl *
decl_variable(Arena *p, Token *pos, Intern_String name, Typespec *typespec, Expr *expr){
Decl *result = decl_new(p, DECL_Variable, pos, name);
result->var_decl.type = typespec;
result->var_decl.expr = expr;
return result;
}
function Decl *
decl_function(Arena *p, Token *pos, Intern_String name, Typespec *ret){
Decl *result = decl_new(p, DECL_Function, pos, name);
result->func_decl.ret = ret;
return result;
}
function void
decl_func_push(Arena *p, Decl *parent, Token *pos, Intern_String name, Typespec *type){
assert(parent->kind == DECL_Function);
Decl_Function_Arg *result = arena_push_struct(p, Decl_Function_Arg);
result->name = name;
result->typespec = type;
result->pos = pos;
SLLQueuePush(parent->func_decl.first, parent->func_decl.last, result);
}
function void
decl_enum_push(Arena *p, Decl *parent, Token *pos, Intern_String name, Expr *expr, Note *notes){
assert(parent->kind == DECL_Enum);
Decl_Enum_Child *child = arena_push_struct(p, Decl_Enum_Child);
child->pos = pos;
child->name = name;
child->expr = expr;
child->first_note = notes->first;
child->last_note = notes->last;
SLLQueuePush(parent->enum_decl.first, parent->enum_decl.last, child);
}
function void
decl_struct_push(Decl *parent, Decl *child){
assert(parent->kind == DECL_Struct || parent->kind == DECL_Union);
SLLQueuePush(parent->struct_decl.first, parent->struct_decl.last, child);
}
function void
decl_list_push(Decl *parent, Decl *child){
assert(parent->kind == DECL_List);
SLLQueuePush(parent->list_decl.first, parent->list_decl.last, child);
}
//-----------------------------------------------------------------------------
// Double linked list
//-----------------------------------------------------------------------------
function void
decl_list_push(Decl *l, Decl *node){
decl_dll_list_push(Decl *l, Decl *node){
if(l->list_decl.first == 0){
l->list_decl.first = l->list_decl.last = node;
node->prev = 0;
@@ -459,7 +602,7 @@ decl_list_push(Decl *l, Decl *node){
}
function void
decl_list_push_front(Decl *l, Decl *node){
decl_dll_list_push_front(Decl *l, Decl *node){
if(l->list_decl.first == 0){
l->list_decl.first = l->list_decl.last = node;
node->prev = 0;
@@ -523,10 +666,10 @@ ast_test(){
decls[2].kind = 2;
decls[3].kind = 3;
decls[4].kind = 4;
decl_list_push(decls, decls+1);
decl_list_push(decls, decls+2);
decl_list_push(decls, decls+3);
decl_list_push_front(decls, decls+4);
decl_dll_list_push(decls, decls+1);
decl_dll_list_push(decls, decls+2);
decl_dll_list_push(decls, decls+3);
decl_dll_list_push_front(decls, decls+4);
//list_print(decls);
decl_list_remove(decls, decls+1);