#if 0 String:struct{ str: U8*; len: S64; } Intern_String:typedef String; Token_Kind:enum{ @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, } Token:struct{ kind:Token_Kind; union:{ string:String; struct:{str:U8*; len:U64;} } union:{ int_val:S64; error_val:String; intern_val:Intern_String; } file:String; line:S64; line_begin:U8*; } AST_Kind:enum{ BaseType, Typedef, Enum, Struct, Union, Note, List, Pointer, Array, Function, Variable, EnumChild, } AST_Node:struct{ kind: AST_Kind; node: AST_Node[16]; 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*; } } #endif typedef struct AST_Node AST_Node; typedef struct Expr Expr; typedef 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, }AST_Kind; struct AST_Node{ AST_Kind kind; Token *pos; Expr *expr; 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; }; }; function B32 ast_is_type(AST_Node *n){ B32 result = n->kind >= AK_BaseType && n->kind <= AK_Union; return result; }