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; };