Basic compound parsing, maybe I should unify with calls again

This commit is contained in:
Krzosa Karol
2022-06-10 23:03:21 +02:00
parent cf1237f449
commit 7365d6aa88
4 changed files with 75 additions and 7 deletions

View File

@@ -145,6 +145,37 @@ parse_init_stmt(Ast_Expr *expr){
return expr;
}
// @todo: Unify with call ???
function Ast_Compound *
parse_compound(Ast_Expr *left){
Scratch scratch;
Token *pos = token_get();
Array<Ast_Compound_Item *> exprs = {scratch};
while(!token_is(TK_CloseBrace)){
Token *token = token_get();
Ast_Atom *name = 0;
Ast_Expr *item = parse_expr();
if(token_match(TK_Assign)){
assert(is_flag_set(item->flags, AST_ATOM));
name = (Ast_Atom *)item;
item = parse_expr();
}
Ast_Compound_Item *item_comp = ast_compound_item(token, name, 0, item);
exprs.add(item_comp);
if(!token_match(TK_Comma)){
break;
}
}
token_expect(TK_CloseBrace);
Ast_Compound *result = ast_compound(pos, left, exprs);
return result;
}
function Ast_Call *
parse_expr_call(Ast_Expr *left){
Scratch scratch;
@@ -215,7 +246,6 @@ parse_stmt_scope(Ast_Scope *scope_defined_outside = 0){
init = parse_init_stmt(expr_first);
}
if(token_match(TK_Comma)){
if(!token_is(TK_Comma)) cond = parse_expr();
if(token_match(TK_Comma)){
@@ -351,6 +381,7 @@ binding_power(Binding binding, Token_Kind kind){
case TK_Dereference:
case TK_Keyword:
case TK_OpenParen:
case TK_OpenBrace:
case TK_Sub:
case TK_Add:
case TK_Neg:
@@ -391,6 +422,7 @@ binding_power(Binding binding, Token_Kind kind){
case TK_Decrement:
case TK_OpenBracket:
case TK_OpenParen:
case TK_OpenBrace:
return {21, -2};
default: return{-1,-1};
}
@@ -429,6 +461,10 @@ parse_expr(S64 min_bp){
left = result;
}break;
case TK_OpenBrace: {
left = parse_compound(0);
}break;
case TK_Keyword: {
if(token->intern_val == keyword_true) left = ast_bool(token, 1);
else if(token->intern_val == keyword_false) left = ast_bool(token, 0);
@@ -475,6 +511,9 @@ parse_expr(S64 min_bp){
token_expect(TK_CloseBracket);
left = ast_expr_index(token, left, index);
}break;
case TK_OpenBrace: {
left = parse_compound(left);
}break;
case TK_OpenParen:{
left = parse_expr_call(left);
}break;