C codegen

This commit is contained in:
Krzosa Karol
2022-05-03 20:08:13 +02:00
parent 8c04044ea2
commit 557dde1936
11 changed files with 573 additions and 281 deletions

409
output.cc
View File

@@ -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;
};