Struct field access. Damn, I coded for like 30 minutes and then it just worked on the first try
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user