From 7365d6aa88b81d9f9cde3798a04d4579675944e5 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Fri, 10 Jun 2022 23:03:21 +0200 Subject: [PATCH] Basic compound parsing, maybe I should unify with calls again --- ast.cpp | 35 +++++++++++++++++++++++++++++++++-- globals.kl | 3 ++- main.cpp | 3 --- parsing.cpp | 41 ++++++++++++++++++++++++++++++++++++++++- 4 files changed, 75 insertions(+), 7 deletions(-) diff --git a/ast.cpp b/ast.cpp index 2c94d7f..6c10484 100644 --- a/ast.cpp +++ b/ast.cpp @@ -17,6 +17,8 @@ enum Ast_Kind: U32{ AST_CALL_ITEM, AST_CALL, + AST_COMPOUND, + AST_COMPOUND_ITEM, AST_TYPE, AST_VAR, AST_CONST, @@ -80,13 +82,25 @@ struct Ast_Atom: Ast_Expr{ INLINE_VALUE_FIELDS; }; +struct Ast_Compound_Item: Ast_Expr{ + Ast_Atom *name; + Ast_Expr *index; + Ast_Expr *item; +}; + +struct Ast_Compound: Ast_Expr{ + Ast_Resolved_Type *type; + Ast_Expr *typespec; + Array exprs; +}; + struct Ast_Call_Item: Ast_Expr{ - Ast_Atom *name; // index | name + Ast_Atom *name; Ast_Expr *item; }; struct Ast_Call: Ast_Expr{ - Ast_Resolved_Type *type; // @todo: to map + Ast_Resolved_Type *type; Ast_Expr *name; Array exprs; }; @@ -283,6 +297,23 @@ ast_expr_binary(Ast_Expr *left, Ast_Expr *right, Token *op){ return result; } +function Ast_Compound * +ast_compound(Token *pos, Ast_Expr *typespec, Array exprs){ + AST_NEW(Compound, COMPOUND, pos, AST_EXPR); + result->typespec = typespec; + result->exprs = exprs.tight_copy(pctx->perm); + return result; +} + +function Ast_Compound_Item * +ast_compound_item(Token *pos, Ast_Atom *name, Ast_Expr *index, Ast_Expr *item){ + AST_NEW(Compound_Item, COMPOUND_ITEM, pos, AST_EXPR); + result->name = name; + result->index = index; + result->item = item; + return result; +} + function Ast_Call * ast_call(Token *pos, Ast_Expr *name, Array exprs){ AST_NEW(Call, CALL, pos, AST_EXPR); diff --git a/globals.kl b/globals.kl index ad9b149..97b428f 100644 --- a/globals.kl +++ b/globals.kl @@ -21,7 +21,8 @@ Boolean: Bool = true //----------------------------------------------------------------------------- // Compound expressions //----------------------------------------------------------------------------- -array1: [4]S64 +array1: [4]S64 = {1,2,3,4} + //----------------------------------------------------------------------------- // Pointers diff --git a/main.cpp b/main.cpp index 7c07d47..fb8ae3e 100644 --- a/main.cpp +++ b/main.cpp @@ -200,9 +200,6 @@ int main(int argument_count, char **arguments){ system((const char *)run_program.str); } - else{ - - } #endif Scratch scratch; Array files = {scratch}; diff --git a/parsing.cpp b/parsing.cpp index 77d2191..445c75e 100644 --- a/parsing.cpp +++ b/parsing.cpp @@ -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 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;