Generating valid c code, more work on null values
This commit is contained in:
50
new_ast.cpp
50
new_ast.cpp
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user