Generating valid c code, more work on null values

This commit is contained in:
Krzosa Karol
2022-05-24 20:33:11 +02:00
parent 236ff0cd64
commit 5176b40204
17 changed files with 698 additions and 1258 deletions

View File

@@ -4,7 +4,7 @@
//
// Parser::ast_arena - arena for asts
// Lexer::interns::string_allocator - arena for interns
//
//
Intern_String keyword_struct;
Intern_String keyword_union;
Intern_String keyword_cast;
@@ -19,21 +19,25 @@ const U64 Parse_Ctx_ID = 115151;
struct Parse_Ctx:Lexer{
Allocator *perm; // Stores: AST, tokens, interns
Allocator *heap;
U64 unique_ids;
Map global_syms;
Map type_map;
Token empty_token;
S64 indent;
Intern_String intern(String string){
return intern_string(&interns, string);
}
void init(Allocator *perm_allocator, Allocator *heap_allocator){
perm = perm_allocator;
heap = heap_allocator;
global_syms = {heap};
type_map = {heap};
lex_init(perm, heap, this);
keyword_struct= intern_string(&interns, "struct"_s);
keyword_union = intern_string(&interns, "union"_s);
@@ -41,7 +45,7 @@ struct Parse_Ctx:Lexer{
keyword_enum = intern_string(&interns, "enum"_s);
interns.first_keyword = keyword_struct.str;
interns.last_keyword = keyword_enum.str;
intern_void = intern_string(&interns, "void"_s);
intern_int = intern_string(&interns, "int"_s);
intern_str = intern_string(&interns, "String"_s);
@@ -55,9 +59,9 @@ thread_local Parse_Ctx *pctx;
//-----------------------------------------------------------------------------
enum Ast_Kind{
AST_NONE,
AST_PACKAGE,
AST_STR,
AST_INT,
AST_CAST,
@@ -67,12 +71,12 @@ enum Ast_Kind{
AST_BINARY,
AST_COMPOUND_ITEM,
AST_COMPOUND,
AST_LAMBDA,
AST_LAMBDA_PARAM,
AST_CONST,
AST_VAR,
AST_TYPESPEC_IDENT,
AST_TYPESPEC_POINTER,
AST_TYPESPEC_ARRAY,
@@ -85,6 +89,7 @@ struct Ast{
Token *pos;
};
struct Ast_Resolved_Type;
struct Ast_Typespec;
struct Ast_Expr:Ast{
union{
@@ -94,13 +99,13 @@ struct Ast_Expr:Ast{
Token_Kind op;
Ast_Expr *expr;
}unary;
struct{
Token_Kind op;
Ast_Expr *left;
Ast_Expr *right;
} binary;
struct{
Ast_Resolved_Type *type;
Ast_Typespec *typespec;
Array<Ast_Expr *> exprs;
}compound;
@@ -124,12 +129,19 @@ struct Ast_Expr:Ast{
};
};
struct Ast_Block : Ast {
Array<Ast *> stmts;
};
struct Ast_Lambda : Ast_Expr {
Array<Ast_Expr *> params;
Ast_Typespec *ret;
Ast_Block *block;
};
struct Ast_Resolved_Type;
struct Ast_Typespec:Ast{
Ast_Resolved_Type *resolved_type;
union{
Ast_Typespec *base;
Intern_String name;
@@ -148,10 +160,6 @@ struct Ast_Decl:Ast{
Ast_Typespec *typespec;
Ast_Expr *expr;
}var;
struct{
Array<Ast_Decl*> args;
Ast_Typespec *ret;
}func;
};
};
@@ -164,10 +172,10 @@ struct Ast_Package:Ast{
// AST Constructors beginning with expressions
//-----------------------------------------------------------------------------
#define AST_NEW(T,ikind,ipos) \
Ast_##T *result = exp_alloc_type(pctx->perm, Ast_##T); \
result->kind = ikind; \
result->pos = ipos; \
result->id = ++pctx->unique_ids
Ast_##T *result = exp_alloc_type(pctx->perm, Ast_##T); \
result->kind = ikind; \
result->pos = ipos; \
result->id = ++pctx->unique_ids
function Ast_Expr *
ast_expr_string(Token *pos, Intern_String string){
@@ -327,4 +335,4 @@ ast_package(Token *pos, String name, Array<Ast_Decl *> decls){
result->decls = decls.tight_copy(pctx->perm);
result->name = intern_string(&pctx->interns, name);
return result;
}
}