Working on actually making a program

This commit is contained in:
Krzosa Karol
2022-06-07 12:10:20 +02:00
parent 759825172c
commit af5865b059
5 changed files with 63 additions and 22 deletions

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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("<Number>");
}
else{
return LIT("<Unknown>");
}
}
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;(i<string_to_lex.len);(i+=1)){
if(is_numeric((string_to_lex.str[i]))){
(t.kind=0);
(t.str=(&(string_to_lex.str[i])));
(t.len=i);
for(;is_numeric((string_to_lex.str[i]));){
@@ -54,7 +71,10 @@ void entry(){
}
(t.len=(i-t.len));
((token_array[(token_count++)])=t);
(token_count+=1);
}
}
for(S64 i = 0;(i<token_count);(i++)){
Token *tk = (&(token_array[i]));
printf("%.*s", ((S32 )tk->len), tk->str);
}
}

View File

@@ -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 "<Number>"
else
return "<Unknown>"
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)

View File

@@ -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){
}
}
Scope(){
resolve_expr(node->init, ret);
resolve_expr(node->cond, ret);
resolve_expr(node->iter, ret);
resolve_stmt_block(node->block, ret);
For(node->block->stmts)
resolve_stmt(it, ret);
}
BREAK();
}
CASE(IF, If){
For(node->ifs){
resolve_stmt(it->init, 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);
}