(((534>43)?435:42),234,((S64)32),Thing[10][2],Thing((1,2))) (4+(2*53)) ((4+2)*53) (++5) (--5) (-5) (+5) (sizeof(32)+sizeof(S32*)) ((S64**)5) (((S64)5)+3) ((534>43)?435:42) struct OS_Memory{ data: void*; commit: SizeU; reserve: SizeU; }; struct Arena{ @using memory: OS_Memory; len: U64; alignment: U64; }; struct String{ str: U8*; len: S64; }; typedef Intern_String String; @stringify @prefix = TK_ enum Token_Kind : S64{ @str = End of stream End, @str = * Mul, @str = / Div, @str = + Add, @str = - Sub, @str = % Mod, @str = & BitAnd, @str = | BitOr, @str = ^ BitXor, @str = ~ Neg, @str = ! Not, @str = ( OpenParen, @str = CloseParen, @str = { OpenBrace, @str = } CloseBrace, @str = [ OpenBracket, @str = ] CloseBracket, @str = , Comma, @str = # Pound, @str = ? Question, @str = ... ThreeDots, @str = ; Semicolon, @str = . Dot, @str = < LesserThen, @str = > GreaterThen, @str = : Colon, @str = = Assign, @str = /= DivAssign, @str = *= MulAssign, @str = %= ModAssign, @str = -= SubAssign, @str = += AddAssign, @str = &= AndAssign, @str = |= OrAssign, @str = ^= XorAssign, @str = <<= LeftShiftAssign, @str = >>= RightShiftAssign, @str = :: DoubleColon, @str = @ At, @str = -- Decrement, @str = ++ Increment, @str = -- PostDecrement, @str = ++ PostIncrement, @str = <= LesserThenOrEqual, @str = >= GreaterThenOrEqual, @str = == Equals, @str = && And, @str = || Or, @str = != NotEquals, @str = << LeftShift, @str = >> RightShift, @str = -> Arrow, @str = sizeof ExprSizeof, DocComment, Comment, Identifier, StringLit, U8Lit, Character, Error, Float, Int, Keyword, }; struct Token{ kind: Token_Kind; @using string: String; val: union { integer: S64; error: String; intern: Intern_String; }; file: String; line: S64; line_begin: U8*; }; struct Tokens{ @array tokens: Token*; iter: S64; }; struct Lex_Stream{ stream: U8*; line_begin: U8*; filename: String; line: S64; }; @prefix = EK_ enum Expr_Kind : S64{ None, Atom, Unary, Binary, Ternary, Cast, List, Call, Index, }; struct Expr{ kind: Expr_Kind; token: Token*; next: Expr*; _: union { cast_val: struct { type: AST_Node*; expr: Expr*; }; list: struct { first: Expr*; last: Expr*; }; call: struct { atom: Expr*; list: Expr*; }; index: struct { atom: Expr*; index: Expr*; }; unary: struct { expr: Expr*; }; binary: struct { left: Expr*; right: Expr*; }; ternary: struct { cond: Expr*; on_true: Expr*; on_false: Expr*; }; }; }; @prefix = AK_ enum AST_Kind : S64{ None, BaseType, Typedef, Enum, Struct, Union, Note, List, Pointer, Array, Function, Variable, EnumChild, }; struct AST_Node{ kind: AST_Kind; pos: Token*; name: Intern_String; next: AST_Node*; next_scope: AST_Node*; first_note: AST_Node*; last_note: AST_Node*; first_child: AST_Node*; last_child: AST_Node*; _: union { base_type_size: SizeU; pointer: AST_Node*; typedef_type: AST_Node*; variable_type: AST_Node*; func_return_type: AST_Node*; }; }; struct Parser_Error{ next: Parser_Error*; message: String; token: Token*; }; struct Scope{ next: Scope*; first: AST_Node*; last: AST_Node*; }; struct Parser{ main_arena: Arena; intern_table_arena: Arena; symbol_table_arena: Arena; scope_free_list: Scope*; scope_stack: Scope*; global_scope: Scope*; symbols_inserted: S64; symbols_count: S64; symbols: AST_Node*; interns: Intern_String*; interns_in_bytes: S64; interns_inserted: S64; interns_count: S64; first_keyword: U8*; last_keyword: U8*; @sllqueue default: Parser_Error; @sllqueue error: Parser_Error; @using token_array: Tokens; };