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

View File

@@ -1,15 +1,7 @@
function Decl *parse_decl(Parser *p);
function Decl *parse_struct(Parser *p, Token *name, Decl_Kind kind);
function Decl *parse_struct(Parser *p, Token *name, Decl_Kind kind, Decl_Struct_Kind);
function Typespec *parse_type(Parser *p);
function Typespec *
parse_type_struct(Parser *p, Token *token){
Decl_Kind kind = intern_compare(token->intern_val, keyword_struct) ? DECL_Struct : DECL_Union;
Decl *decl = parse_struct(p, token, kind);
decl->name = (Intern_String){};
return typespec_struct(p, token, decl);
}
function Typespec *
parse_type_function(Parser *p, Token *token){
Typespec *result = typespec_function(p, token, 0);
@@ -35,14 +27,13 @@ parse_type_function(Parser *p, Token *token){
function Typespec *
parse_type(Parser *p){
// Parse as function type or normal
Token *token = 0;
Typespec *result = 0;
if((token = token_match(p, TK_Identifier))){
result = typespec_name(p, token, token->intern_val);
}
else if((token = token_match_keyword(p, keyword_struct)) || (token = token_match_keyword(p, keyword_union))){
result = parse_type_struct(p, token);
}
else if((token = token_match(p, TK_OpenParen))){
result = parse_type_function(p, token);
}
@@ -51,6 +42,7 @@ parse_type(Parser *p){
return 0;
}
// Parse Pointer/Array
for(;;){
if((token = token_match(p, TK_Mul))){
result = typespec_pointer(p, token, result);
@@ -65,6 +57,8 @@ parse_type(Parser *p){
}
else break;
}
return result;
}
@@ -111,6 +105,14 @@ parse_notes(Parser *p){
return result;
}
function Token *
parse_get_token_name(Parser *p, S32 count){
Token *result = token_next(p);
for(S32 i = 0; i < count; i++)
token_next(p);
return result;
}
function Decl *
parse_enum(Parser *p, Token *name){
Typespec *type = 0;
@@ -132,18 +134,35 @@ parse_enum(Parser *p, Token *name){
}
function Decl *
parse_struct(Parser *p, Token *name, Decl_Kind kind){
Decl *result = decl_struct(p, kind, name, name->intern_val);
parse_struct(Parser *p, Token *name, Decl_Kind kind, Decl_Struct_Kind struct_kind){
Decl *result = decl_struct(p, kind, name, name->intern_val, struct_kind);
token_expect(p, TK_OpenBrace);
while(!token_is(p, TK_CloseBrace)){
Decl *decl = 0;
if((decl = parse_decl(p))){
decl_struct_push(result, decl);
}
else if(token_match_keyword(p, keyword_union)){
decl = parse_struct(p, token_get(p), DECL_Union, STRUCT_Nested);
}
else if(token_match_keyword(p, keyword_struct)){
decl = parse_struct(p, token_get(p), DECL_Struct, STRUCT_Nested);
}
else if(token_is(p, TK_Identifier) &&
token_peek_is(p, 1, TK_Colon) &&
token_peek_is_keyword(p, 2, keyword_union)){
decl = parse_struct(p, parse_get_token_name(p, 2), DECL_Union, STRUCT_Nested);
}
else if(token_is(p, TK_Identifier) &&
token_peek_is(p, 1, TK_Colon) &&
token_peek_is_keyword(p, 2, keyword_struct)){
decl = parse_struct(p, parse_get_token_name(p, 2), DECL_Struct, STRUCT_Nested);
}
else {
parser_push_error(p, token_get(p), "Unexpected token while parsing struct");
break;
}
if(decl) decl_struct_push(result, decl);
}
token_expect(p, TK_CloseBrace);
return result;
@@ -163,13 +182,29 @@ parse_typedef(Parser *p, Token *name){
return decl_typedef(p, name, name->intern_val, type);
}
function Token *
parse_get_token_name(Parser *p, S32 count){
Token *result = token_next(p);
for(S32 i = 0; i < count; i++)
token_next(p);
/*
function Decl *
parse_function(Parser *p, Token *name){
Decl *result = decl_function(p, name, name->intern_val, 0);
if(!token_is(p, TK_CloseParen)){
for(;;) {
if((name = token_match(p, TK_Identifier)))
decl_function_push(p, result, name, name->intern_val, parse_type(p));
else if(!token_match(p, TK_Comma))
break;
}
}
token_expect(p, TK_CloseParen);
if(token_is(p, TK_Identifier))
result->function_decl.ret = parse_type(p);
token_expect(p, TK_OpenBrace);
parse_stmt_list(p, result);
token_expect(p, TK_CloseBrace);
return result;
}
*/
function Decl *
parse_decl(Parser *p){
@@ -179,10 +214,10 @@ parse_decl(Parser *p){
if(token_is(p, TK_Identifier)){
if(token_peek_is(p, 1, TK_DoubleColon)){
if(token_peek_is_keyword(p, 2, keyword_struct)){
result = parse_struct(p, parse_get_token_name(p,2), DECL_Struct);
result = parse_struct(p, parse_get_token_name(p,2), DECL_Struct, STRUCT_Base);
}
else if(token_peek_is_keyword(p, 2, keyword_union)){
result = parse_struct(p, parse_get_token_name(p,2), DECL_Union);
result = parse_struct(p, parse_get_token_name(p,2), DECL_Union, STRUCT_Base);
}
else if(token_peek_is_keyword(p, 2, keyword_enum)){
result = parse_enum(p, parse_get_token_name(p,2));
@@ -193,8 +228,6 @@ parse_decl(Parser *p){
}
else if(token_peek_is(p, 1, TK_Colon)){
if(token_peek_is(p, 2, TK_Identifier) ||
token_peek_is_keyword(p, 2, keyword_union) ||
token_peek_is_keyword(p, 2, keyword_struct) ||
token_peek_is(p, 2, TK_OpenParen)){
result = parse_variable(p, parse_get_token_name(p,1));
}