Struct field access. Damn, I coded for like 30 minutes and then it just worked on the first try

This commit is contained in:
Krzosa Karol
2022-05-30 18:27:06 +02:00
parent 0e0b95ab52
commit 980a3b68b9
6 changed files with 186 additions and 41 deletions

View File

@@ -353,7 +353,7 @@ left_denotation(Token *op, Ast_Expr *left){
function S64
postfix_binding_power(Token_Kind kind){
switch(kind){
case TK_Decrement: case TK_Increment: case TK_OpenBracket: case TK_OpenParen: return 1;
case TK_Dot: case TK_Decrement: case TK_Increment: case TK_OpenBracket: case TK_OpenParen: return 1;
default: return 0;
}
}
@@ -369,6 +369,12 @@ parse_expr(S64 rbp){
if(postfix_binding_power(token->kind) > rbp){
token_next();
switch(token->kind){
case TK_Dot: {
// @note: making sure that we always get a configuration where
// Identifier is in left node
Ast_Expr *right = parse_expr();
left = ast_expr_binary(left, right, token);
}break;
case TK_OpenBracket:{
Ast_Expr *index = parse_expr();
left = ast_expr_index(token, left, index);
@@ -406,18 +412,25 @@ parse_assign_expr(){
function Ast_Struct *
parse_struct(Token *pos){
Scratch scratch;
Array<Ast_Named *> members = {scratch};
Array<Ast_Var *> members = {scratch};
Array<Ast_Const *> members_const = {scratch};
token_match(OPEN_SCOPE);
do{
Token *token = token_get();
Ast_Named *named = parse_named(false);
if(!named) parsing_error(token, "Failed to parse struct member");
members.add(named);
if(named->kind == AST_CONST){
members_const.add((Ast_Const *)named);
} else {
assert(named->kind == AST_VAR);
members.add((Ast_Var *)named);
}
}while(token_match(SAME_SCOPE));
token_expect(CLOSE_SCOPE);
Ast_Struct *result = ast_struct(pos, members);
Ast_Struct *result = ast_struct(pos, members, members_const);
return result;
}