C codegen
This commit is contained in:
81
parse_decl.c
81
parse_decl.c
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user