310 lines
5.2 KiB
C++
310 lines
5.2 KiB
C++
#if 0
|
|
|
|
|
|
@register
|
|
@param_expr(size)
|
|
@param_type(Type)
|
|
test::struct{
|
|
Array_Block::struct{
|
|
next: Array_Block*;
|
|
data: Type[size];
|
|
}
|
|
|
|
@inline Array::struct{
|
|
first: Array_Block;
|
|
last : Array_Block*;
|
|
block: S64;
|
|
len : S64;
|
|
}
|
|
|
|
array_make::(arena: Arena*) Type {
|
|
thing: Test_Type;
|
|
result: Type;
|
|
result.arena = arena;
|
|
result.last = &result.first;
|
|
return result;
|
|
}
|
|
|
|
array_push::(array: Array*, item: Type*){
|
|
if array->len+1 > size{
|
|
assert(array->len);
|
|
block: Array_Block* = cast(Thing)arena_push_struct(array->arena, sizeof(:Array_Block));
|
|
array->last = array->last.next = block;
|
|
array->len = 0;
|
|
array->block += 1;
|
|
}
|
|
array->last.data[array->len++] = *item;
|
|
}
|
|
}
|
|
|
|
@test(size = 4096)
|
|
OpenGL :: struct{
|
|
glVertexAttribPointer: (GLuint, GLint, GLenum, GLboolean, GLsizei, GLvoid*);
|
|
glBindTexture: (GLenum, GLuint);
|
|
glDrawArrays: (GLenum, GLint, GLsizei);
|
|
|
|
test_array: int*[10];
|
|
|
|
thing : Things*;
|
|
thing_cap: S64;
|
|
thing_len: S64;
|
|
}
|
|
|
|
OS_Memory::struct{
|
|
data: void*;
|
|
commit: SizeU;
|
|
reserve: SizeU;
|
|
}
|
|
|
|
Arena::struct{
|
|
@using memory: OS_Memory;
|
|
len: U64;
|
|
alignment: U64;
|
|
}
|
|
|
|
String::struct{
|
|
str: U8*;
|
|
len: S64;
|
|
}
|
|
Intern_String::typedef String;
|
|
|
|
@stringify
|
|
@prefix="TK_"
|
|
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,
|
|
}
|
|
|
|
@array(type=block)
|
|
Token::struct{
|
|
kind:Token_Kind;
|
|
@using string:String;
|
|
union{
|
|
integer_val:S64;
|
|
error_val:String;
|
|
intern_val:Intern_String;
|
|
}
|
|
file:String;
|
|
line:S64;
|
|
line_begin:U8*;
|
|
}
|
|
|
|
Lex_Stream::struct{
|
|
stream: U8*;
|
|
line_begin: U8*;
|
|
filename: String;
|
|
line: S64;
|
|
}
|
|
|
|
@prefix="EK_"
|
|
Expr_Kind::enum{
|
|
None,
|
|
Atom,
|
|
Unary,
|
|
Binary,
|
|
Ternary,
|
|
Cast,
|
|
List,
|
|
Call,
|
|
Index,
|
|
}
|
|
|
|
Expr:: struct{
|
|
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_"
|
|
AST_Kind::enum{
|
|
None,
|
|
BaseType,
|
|
Typedef,
|
|
Enum,
|
|
Struct,
|
|
Union,
|
|
Note,
|
|
List,
|
|
Pointer,
|
|
Array,
|
|
Function,
|
|
Variable,
|
|
EnumChild,
|
|
}
|
|
|
|
AST_Node::struct{
|
|
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*;
|
|
}
|
|
}
|
|
|
|
Parser_Error :: struct{
|
|
next: Parser_Error*;
|
|
message: String;
|
|
token : Token *;
|
|
}
|
|
|
|
Scope :: struct{
|
|
next : Scope*;
|
|
first: AST_Node*;
|
|
last : AST_Node*;
|
|
}
|
|
|
|
|
|
Parser :: struct{
|
|
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 *;
|
|
|
|
//@map(type="sparse") symbols: AST_Node;
|
|
|
|
// @Todo(Krzosa): This adds default to function name currently
|
|
// And it's hard to anything else sort of except adding
|
|
// a variable of _var_name_lower_with_ or something
|
|
@sllqueue default: Parser_Error;
|
|
|
|
// This works ok
|
|
@sllqueue error: Parser_Error;
|
|
//@using token_array: Tokens;
|
|
}
|
|
|
|
/*
|
|
|
|
@register_tag(sllqueue)
|
|
@params(next=next,last=last,first=first)
|
|
function void
|
|
struct_type_lower_var_name_lower_push(struct_type *parent, var_type *child){
|
|
if(parent->first == 0){
|
|
- parent->first = parent->last = child;
|
|
}
|
|
else{
|
|
- parent->last = parent->last->next = child;
|
|
}
|
|
}
|
|
*/
|
|
|
|
#endif
|