More parsing of expressions
This commit is contained in:
179
new_ast.c
179
new_ast.c
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user