Files
corelang/output.cc
Krzosa Karol 557dde1936 C codegen
2022-05-03 20:08:13 +02:00

244 lines
3.3 KiB
C++

typedef struct OpenGL OpenGL;
struct OpenGL{
void(*glVertexAttribPointer)(GLuint, GLint, GLenum, GLboolean, GLsizei, GLvoid*);
void(*glBindTexture)(GLenum, GLuint);
void(*glDrawArrays)(GLenum, GLint, GLsizei);
};
typedef struct OS_Memory OS_Memory;
struct OS_Memory{
void* data;
SizeU commit;
SizeU reserve;
};
typedef struct Arena Arena;
struct Arena{
OS_Memory memory;
U64 len;
U64 alignment;
};
typedef struct String String;
struct String{
U8* str;
S64 len;
};
typedef Intern_String String;
enum Token_Kind{
TK_End,
TK_Mul,
TK_Div,
TK_Add,
TK_Sub,
TK_Mod,
TK_BitAnd,
TK_BitOr,
TK_BitXor,
TK_Neg,
TK_Not,
TK_OpenParen,
TK_CloseParen,
TK_OpenBrace,
TK_CloseBrace,
TK_OpenBracket,
TK_CloseBracket,
TK_Comma,
TK_Pound,
TK_Question,
TK_ThreeDots,
TK_Semicolon,
TK_Dot,
TK_LesserThen,
TK_GreaterThen,
TK_Colon,
TK_Assign,
TK_DivAssign,
TK_MulAssign,
TK_ModAssign,
TK_SubAssign,
TK_AddAssign,
TK_AndAssign,
TK_OrAssign,
TK_XorAssign,
TK_LeftShiftAssign,
TK_RightShiftAssign,
TK_DoubleColon,
TK_At,
TK_Decrement,
TK_Increment,
TK_PostDecrement,
TK_PostIncrement,
TK_LesserThenOrEqual,
TK_GreaterThenOrEqual,
TK_Equals,
TK_And,
TK_Or,
TK_NotEquals,
TK_LeftShift,
TK_RightShift,
TK_Arrow,
TK_ExprSizeof,
TK_DocComment,
TK_Comment,
TK_Identifier,
TK_StringLit,
TK_U8Lit,
TK_Character,
TK_Error,
TK_Float,
TK_Int,
TK_Keyword,
};
typedef struct Token Token;
struct Token{
Token_Kind kind;
String string;
union {
S64 integer_val;
String error_val;
Intern_String intern_val;
};
String file;
S64 line;
U8* line_begin;
};
typedef struct Tokens Tokens;
struct Tokens{
Token* tokens;
S64 iter;
};
typedef struct Lex_Stream Lex_Stream;
struct Lex_Stream{
U8* stream;
U8* line_begin;
String filename;
S64 line;
};
enum Expr_Kind{
EK_None,
EK_Atom,
EK_Unary,
EK_Binary,
EK_Ternary,
EK_Cast,
EK_List,
EK_Call,
EK_Index,
};
typedef struct Expr Expr;
struct Expr{
Expr_Kind kind;
Token* token;
Expr* next;
union {
struct cast_val{
AST_Node* type;
Expr* expr;
};
struct list{
Expr* first;
Expr* last;
};
struct call{
Expr* atom;
Expr* list;
};
struct index{
Expr* atom;
Expr* index;
};
struct unary{
Expr* expr;
};
struct binary{
Expr* left;
Expr* right;
};
struct ternary{
Expr* cond;
Expr* on_true;
Expr* on_false;
};
};
};
enum AST_Kind{
AK_None,
AK_BaseType,
AK_Typedef,
AK_Enum,
AK_Struct,
AK_Union,
AK_Note,
AK_List,
AK_Pointer,
AK_Array,
AK_Function,
AK_Variable,
AK_EnumChild,
};
typedef struct AST_Node AST_Node;
struct AST_Node{
AST_Kind kind;
Token* pos;
Intern_String name;
AST_Node* next;
AST_Node* next_scope;
AST_Node* first_note;
AST_Node* last_note;
AST_Node* first_child;
AST_Node* last_child;
union {
SizeU base_type_size;
AST_Node* pointer;
AST_Node* typedef_type;
AST_Node* variable_type;
AST_Node* func_return_type;
};
};
typedef struct Parser_Error Parser_Error;
struct Parser_Error{
Parser_Error* next;
String message;
Token* token;
};
typedef struct Scope Scope;
struct Scope{
Scope* next;
AST_Node* first;
AST_Node* last;
};
typedef struct Parser Parser;
struct Parser{
Arena main_arena;
Arena intern_table_arena;
Arena symbol_table_arena;
Scope* scope_free_list;
Scope* scope_stack;
Scope* global_scope;
S64 symbols_inserted;
S64 symbols_count;
AST_Node* symbols;
Intern_String* interns;
S64 interns_in_bytes;
S64 interns_inserted;
S64 interns_count;
U8* first_keyword;
U8* last_keyword;
Parser_Error default;
Parser_Error error;
Tokens token_array;
};