diff --git a/ccodegen.cpp b/ccodegen.cpp index b99968b..c5c4511 100644 --- a/ccodegen.cpp +++ b/ccodegen.cpp @@ -183,7 +183,10 @@ gen_expr(Ast_Expr *ast){ auto name_for_printf = (Ast_Atom *)node->name; For(node->exprs){ if(intern_printf == name_for_printf->intern_val && &it == node->exprs.data){ - gen("\"%s\"", name_for_printf->intern_val.str); + Ast_Atom *atom = (Ast_Atom *)it->item; + assert(atom->kind == AST_VALUE); + assert(atom->type == untyped_string); + gen("\"%s\"", atom->intern_val.str); } else gen_expr(it->item); if(!node->exprs.is_last(&it)) gen(", "); @@ -218,6 +221,7 @@ gen_ast(Ast *ast){ CASE(PACKAGE, Package){ For(node->ordered) { + genln(""); genln(""); gen_ast(it); } diff --git a/main.cpp b/main.cpp index 6783600..e64761e 100644 --- a/main.cpp +++ b/main.cpp @@ -78,8 +78,9 @@ Expr: @todo [ ] - Passing down program to compile through command line -[ ] - Switch [ ] - Arrays with size passed +[ ] - Switch +[ ] - Fix printf somehow. [ ] - Comma notation when declaring variables thing1, thing2: S32 [ ] - Array of inferred size @@ -106,6 +107,7 @@ Expr: [ ] - Compound that zeros values - .{} , Compound that assumes defaults from struct definition - {} [ ] - Inject stack traces into the program [ ] - Rewrite constants to embed lambda, types, structs etc.? ??? +[ ] - Var args using Any array - args: []Any - delete vargs @donzo [x] - We need ++ -- operators @@ -185,9 +187,9 @@ int main(){ printf("%s", result.str); result = compile_file("lambdas.kl"_s); printf("%s", result.str); -#endif result = compile_file("new_types.kl"_s); printf("%s", result.str); +#endif #if 1 diff --git a/program.c b/program.c index 7c8c635..33b9c46 100644 --- a/program.c +++ b/program.c @@ -31,22 +31,39 @@ int main(){ } + + typedef struct Token{ + U8 kind; U8 *str; S64 len; + /*enum Kind{ + Number = 0, + };*/ }Token; + +String kind_name(U8 kind){ + if((kind==0)){ + return LIT(""); + } + else{ + return LIT(""); + } +} + Bool is_numeric(U8 c){ Bool result = ((c>=48)&&(c<=57)); return result; } + void entry(){ String string_to_lex = LIT("Identifier 2425525 Not_Number"); Token token_array[32]; - U32 token_count; - printf("printf", 32); + S64 token_count = 0; Token t; for(S64 i = 0;(ilen), tk->str); + } } \ No newline at end of file diff --git a/program.kl b/program.kl index 6a7f909..a15c827 100644 --- a/program.kl +++ b/program.kl @@ -1,10 +1,20 @@ - #foreign printf :: (str: String, ...) Token :: struct + kind: U8 str: *U8 len: S64 + Kind :: enum + Number + + +kind_name :: (kind: U8): String + if kind == Token.Kind.Number + return "" + else + return "" + is_numeric :: (c: U8): Bool result := c >= '0 && c <= '9 return result @@ -12,20 +22,19 @@ is_numeric :: (c: U8): Bool entry :: () string_to_lex := "Identifier 2425525 Not_Number" token_array: [32]Token - token_count: U32 - - printf("test %d", 32) + token_count: S64 = 0 t: Token for i := 0, i < string_to_lex.len, i+=1 if is_numeric(string_to_lex.str[i]) + t.kind = Token.Kind.Number t.str = &string_to_lex.str[i] t.len = i for is_numeric(string_to_lex.str[i]) i+=1 t.len = i - t.len token_array[token_count++] = t - token_count+=1 - - + for i := 0, i < token_count, i++ + tk := &token_array[i] + printf("%.*s", cast(tk.len: S32), tk.str) diff --git a/typecheck.cpp b/typecheck.cpp index 33d7112..a3c1f7c 100644 --- a/typecheck.cpp +++ b/typecheck.cpp @@ -352,9 +352,7 @@ resolve_typespec(Ast_Expr *ast, B32 ast_can_be_null){ function void resolve_stmt(Ast *ast, Ast_Resolved_Type *ret); function void resolve_stmt_block(Ast_Block *block, Ast_Resolved_Type *ret){ - Scope(){ - For(block->stmts) resolve_stmt(it, ret); - } + } // @note: Ret is return value of function passed down the stack @@ -397,18 +395,25 @@ resolve_stmt(Ast *ast, Ast_Resolved_Type *ret){ } } - resolve_expr(node->init, ret); - resolve_expr(node->cond, ret); - resolve_expr(node->iter, ret); - resolve_stmt_block(node->block, ret); + Scope(){ + resolve_expr(node->init, ret); + resolve_expr(node->cond, ret); + resolve_expr(node->iter, ret); + For(node->block->stmts) + resolve_stmt(it, ret); + } BREAK(); } CASE(IF, If){ For(node->ifs){ resolve_stmt(it->init, ret); - resolve_expr(it->expr); // @todo: typechecking - resolve_stmt_block(it->block, ret); + Scope(){ + resolve_expr(it->expr); // @todo: typechecking + resolve_stmt_block(it->block, ret); + For_It(it->block->stmts, jt) + resolve_stmt(jt, ret); + } } BREAK(); } @@ -690,6 +695,7 @@ resolve_expr(Ast_Expr *ast, Ast_Resolved_Type *expected_type, Sym *lambda_to_res parsing_error(lambda->pos, "Cant name index a lambda with var args"); for(S64 i = lambda->args.len; i < node->exprs.len; i++){ Ast_Call_Item *item = node->exprs.data[i]; + resolve_expr(item->item); item->flags = set_flag(item->flags, AST_ITEM_INCLUDED); items.add(item); }