185 lines
2.8 KiB
C
185 lines
2.8 KiB
C
#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;
|
|
}
|