#pragma once typedef struct Expr Expr; typedef struct Scope Scope; typedef struct AST_Node AST_Node; typedef struct Parser_Error Parser_Error; struct Parser_Error{ Parser_Error *next; String message; Token *token; }; struct Scope{ Scope *next; AST_Node *first; AST_Node *last; }; typedef 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; AST_Node *symbols; S64 symbols_count; S64 interns_in_bytes; S64 interns_inserted; Intern_String *interns; S64 interns_count; U8 *first_keyword; U8 *last_keyword; Parser_Error *first_error; Parser_Error *last_error; Tokens tokens; }Parser; function Intern_String intern_string(Parser *p, String string); function Token *token_get(Parser *p); function B32 intern_compare(Intern_String a, Intern_String b); function void parser_push_scope(Parser *p); function AST_Node *symbol_register_basic_type(Parser *p, Intern_String string, SizeU size);