C codegen
This commit is contained in:
409
output.cc
409
output.cc
@@ -1,246 +1,243 @@
|
||||
(((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)
|
||||
typedef struct OpenGL OpenGL;
|
||||
struct OpenGL{
|
||||
void(*glVertexAttribPointer)(GLuint, GLint, GLenum, GLboolean, GLsizei, GLvoid*);
|
||||
void(*glBindTexture)(GLenum, GLuint);
|
||||
void(*glDrawArrays)(GLenum, GLint, GLsizei);
|
||||
};
|
||||
|
||||
typedef struct OS_Memory OS_Memory;
|
||||
struct OS_Memory{
|
||||
data: void*;
|
||||
commit: SizeU;
|
||||
reserve: SizeU;
|
||||
void* data;
|
||||
SizeU commit;
|
||||
SizeU reserve;
|
||||
};
|
||||
|
||||
typedef struct Arena Arena;
|
||||
struct Arena{
|
||||
@using memory: OS_Memory;
|
||||
len: U64;
|
||||
alignment: U64;
|
||||
OS_Memory memory;
|
||||
U64 len;
|
||||
U64 alignment;
|
||||
};
|
||||
|
||||
typedef struct String String;
|
||||
struct String{
|
||||
str: U8*;
|
||||
len: S64;
|
||||
U8* str;
|
||||
S64 len;
|
||||
};
|
||||
|
||||
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,
|
||||
enum Token_Kind{
|
||||
TK_End,
|
||||
TK_Mul,
|
||||
TK_Div,
|
||||
TK_Add,
|
||||
TK_Sub,
|
||||
TK_Mod,
|
||||
TK_BitAnd,
|
||||
TK_BitOr,
|
||||
TK_BitXor,
|
||||
TK_Neg,
|
||||
TK_Not,
|
||||
TK_OpenParen,
|
||||
TK_CloseParen,
|
||||
TK_OpenBrace,
|
||||
TK_CloseBrace,
|
||||
TK_OpenBracket,
|
||||
TK_CloseBracket,
|
||||
TK_Comma,
|
||||
TK_Pound,
|
||||
TK_Question,
|
||||
TK_ThreeDots,
|
||||
TK_Semicolon,
|
||||
TK_Dot,
|
||||
TK_LesserThen,
|
||||
TK_GreaterThen,
|
||||
TK_Colon,
|
||||
TK_Assign,
|
||||
TK_DivAssign,
|
||||
TK_MulAssign,
|
||||
TK_ModAssign,
|
||||
TK_SubAssign,
|
||||
TK_AddAssign,
|
||||
TK_AndAssign,
|
||||
TK_OrAssign,
|
||||
TK_XorAssign,
|
||||
TK_LeftShiftAssign,
|
||||
TK_RightShiftAssign,
|
||||
TK_DoubleColon,
|
||||
TK_At,
|
||||
TK_Decrement,
|
||||
TK_Increment,
|
||||
TK_PostDecrement,
|
||||
TK_PostIncrement,
|
||||
TK_LesserThenOrEqual,
|
||||
TK_GreaterThenOrEqual,
|
||||
TK_Equals,
|
||||
TK_And,
|
||||
TK_Or,
|
||||
TK_NotEquals,
|
||||
TK_LeftShift,
|
||||
TK_RightShift,
|
||||
TK_Arrow,
|
||||
TK_ExprSizeof,
|
||||
TK_DocComment,
|
||||
TK_Comment,
|
||||
TK_Identifier,
|
||||
TK_StringLit,
|
||||
TK_U8Lit,
|
||||
TK_Character,
|
||||
TK_Error,
|
||||
TK_Float,
|
||||
TK_Int,
|
||||
TK_Keyword,
|
||||
};
|
||||
|
||||
typedef struct Token Token;
|
||||
struct Token{
|
||||
kind: Token_Kind;
|
||||
@using string: String;
|
||||
val: union {
|
||||
integer: S64;
|
||||
error: String;
|
||||
intern: Intern_String;
|
||||
};
|
||||
|
||||
file: String;
|
||||
line: S64;
|
||||
line_begin: U8*;
|
||||
Token_Kind kind;
|
||||
String string;
|
||||
union {
|
||||
S64 integer_val;
|
||||
String error_val;
|
||||
Intern_String intern_val;
|
||||
};
|
||||
String file;
|
||||
S64 line;
|
||||
U8* line_begin;
|
||||
};
|
||||
|
||||
typedef struct Tokens Tokens;
|
||||
struct Tokens{
|
||||
@array tokens: Token*;
|
||||
iter: S64;
|
||||
Token* tokens;
|
||||
S64 iter;
|
||||
};
|
||||
|
||||
typedef struct Lex_Stream Lex_Stream;
|
||||
struct Lex_Stream{
|
||||
stream: U8*;
|
||||
line_begin: U8*;
|
||||
filename: String;
|
||||
line: S64;
|
||||
U8* stream;
|
||||
U8* line_begin;
|
||||
String filename;
|
||||
S64 line;
|
||||
};
|
||||
|
||||
@prefix = EK_ enum Expr_Kind : S64{
|
||||
None,
|
||||
Atom,
|
||||
Unary,
|
||||
Binary,
|
||||
Ternary,
|
||||
Cast,
|
||||
List,
|
||||
Call,
|
||||
Index,
|
||||
enum Expr_Kind{
|
||||
EK_None,
|
||||
EK_Atom,
|
||||
EK_Unary,
|
||||
EK_Binary,
|
||||
EK_Ternary,
|
||||
EK_Cast,
|
||||
EK_List,
|
||||
EK_Call,
|
||||
EK_Index,
|
||||
};
|
||||
|
||||
typedef struct Expr Expr;
|
||||
struct Expr{
|
||||
kind: Expr_Kind;
|
||||
token: Token*;
|
||||
next: Expr*;
|
||||
_: union {
|
||||
cast_val: struct {
|
||||
type: AST_Node*;
|
||||
expr: Expr*;
|
||||
Expr_Kind kind;
|
||||
Token* token;
|
||||
Expr* next;
|
||||
union {
|
||||
struct cast_val{
|
||||
AST_Node* type;
|
||||
Expr* expr;
|
||||
};
|
||||
struct list{
|
||||
Expr* first;
|
||||
Expr* last;
|
||||
};
|
||||
struct call{
|
||||
Expr* atom;
|
||||
Expr* list;
|
||||
};
|
||||
struct index{
|
||||
Expr* atom;
|
||||
Expr* index;
|
||||
};
|
||||
struct unary{
|
||||
Expr* expr;
|
||||
};
|
||||
struct binary{
|
||||
Expr* left;
|
||||
Expr* right;
|
||||
};
|
||||
struct ternary{
|
||||
Expr* cond;
|
||||
Expr* on_true;
|
||||
Expr* on_false;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
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,
|
||||
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,
|
||||
};
|
||||
|
||||
typedef struct AST_Node AST_Node;
|
||||
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*;
|
||||
};
|
||||
|
||||
AST_Kind kind;
|
||||
Token* pos;
|
||||
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;
|
||||
};
|
||||
};
|
||||
|
||||
typedef struct Parser_Error Parser_Error;
|
||||
struct Parser_Error{
|
||||
next: Parser_Error*;
|
||||
message: String;
|
||||
token: Token*;
|
||||
Parser_Error* next;
|
||||
String message;
|
||||
Token* token;
|
||||
};
|
||||
|
||||
typedef struct Scope Scope;
|
||||
struct Scope{
|
||||
next: Scope*;
|
||||
first: AST_Node*;
|
||||
last: AST_Node*;
|
||||
Scope* next;
|
||||
AST_Node* first;
|
||||
AST_Node* last;
|
||||
};
|
||||
|
||||
typedef struct Parser Parser;
|
||||
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;
|
||||
Arena main_arena;
|
||||
Arena intern_table_arena;
|
||||
Arena symbol_table_arena;
|
||||
Scope* scope_free_list;
|
||||
Scope* scope_stack;
|
||||
Scope* global_scope;
|
||||
S64 symbols_inserted;
|
||||
S64 symbols_count;
|
||||
AST_Node* symbols;
|
||||
Intern_String* interns;
|
||||
S64 interns_in_bytes;
|
||||
S64 interns_inserted;
|
||||
S64 interns_count;
|
||||
U8* first_keyword;
|
||||
U8* last_keyword;
|
||||
Parser_Error default;
|
||||
Parser_Error error;
|
||||
Tokens token_array;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user