From 31c2c0045295d31dd001aadd4ba9ef81be20101c Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Sun, 12 Jun 2022 19:41:31 +0200 Subject: [PATCH] Rearrange # flags, Add Windows.kl --- Windows.kl | 10 ++++++++++ ast.cpp | 1 + compiler.h | 2 ++ enums.kl | 2 +- main.cpp | 49 ++++--------------------------------------------- parsing.cpp | 12 ++++++------ 6 files changed, 24 insertions(+), 52 deletions(-) create mode 100644 Windows.kl diff --git a/Windows.kl b/Windows.kl new file mode 100644 index 0000000..278dfef --- /dev/null +++ b/Windows.kl @@ -0,0 +1,10 @@ + +DWORD :: U32 +LPCSTR :: *char +HWND :: *void +HMENU :: *void +HINSTANCE :: *void + +CreateWindowA :: #foreign (dwExStyle: DWORD, lpClassName: *char, lpWindowName: *char, dwStyle: DWORD, X: int, Y: int, nWidth: int, nHeight: int, hWndParent: HWND, hMenu: HMENU, hInstance: HINSTANCE, lpParam: *void): HWND + +// @todo: enum #flag \ No newline at end of file diff --git a/ast.cpp b/ast.cpp index 83863f3..8ed4e62 100644 --- a/ast.cpp +++ b/ast.cpp @@ -49,6 +49,7 @@ enum{ AST_FOREIGN = bit_flag(8), AST_DECL = bit_flag(9), AST_PACKAGE_LEVEL = bit_flag(10), + AST_FLAG = bit_flag(11), }; struct Ast{ diff --git a/compiler.h b/compiler.h index ad8bd2e..21ebde0 100644 --- a/compiler.h +++ b/compiler.h @@ -162,6 +162,7 @@ Intern_String keyword_enum; Intern_String intern_void; Intern_String intern_foreign; Intern_String intern_strict; +Intern_String intern_flag; struct Ast_Scope; @@ -212,6 +213,7 @@ lex_init(Allocator *token_string_arena, Allocator *map_allocator, Lexer *l){ intern_foreign = intern_string(&l->interns, "foreign"_s); intern_strict = intern_string(&l->interns, "strict"_s); intern_void = intern_string(&l->interns, "void"_s); + intern_flag = intern_string(&l->interns, "flag"_s); } function void diff --git a/enums.kl b/enums.kl index dde79a0..2aaae6d 100644 --- a/enums.kl +++ b/enums.kl @@ -1,6 +1,6 @@ package Memory -Allocator_Kind :: enum +Allocator_Kind :: enum #flag Null Arena Heap :: 4 diff --git a/main.cpp b/main.cpp index 9abf2dd..8350b37 100644 --- a/main.cpp +++ b/main.cpp @@ -31,50 +31,6 @@ For now I don't thing it should be overloadable. ------------------------------------------------------------------------------- -Type resolution cases - -CONST :: expr - dont need to handle - make new symbol - -val := expr (1) - convert untyped to typed default - check bounds - make new symbol - -call(default:type = expr) (1) -val: type = expr (1) - convert untyped to typed based on type - make sure expr.type == type - check bounds - -expr == expr (2) -expr * expr (2) - make sure compatible types, floats with ints are ok(convert to float) - if only one of them is typed convert the untyped to typed - if both types typed make sure they are the same - check bounds - -!expr - make sure correct type - return bool - -compound(expr) -call(expr, expr) - convert untyped to matching typed - check if types match - -cast(expr: type) - convert from untyped to typed - convert between typed to other typed - check if types compatible - -Stmt: - Return - Expression should match lambda return type -Expr: - Lambda - Arguments, default values should match type - ArrayT - Should match type int and be constant or not at all - Call - Arguments should match type - @todo [ ] - Should compound resolution use an algorithm to reorder compounds to initialize all fields in order @@ -82,7 +38,10 @@ Expr: [ ] - Add c string [ ] - Some way to take slice of data [ ] - slices should be properly displayed in debugger +[ ] - Rewrite where # happen, +[ ] - cast -> +[ ] - #assert that handles constants at compile time and vars at runtime [ ] - Comma notation when declaring variables thing1, thing2: S32 [ ] - Array of inferred size [ ] - Add single line lambda expressions @@ -90,6 +49,7 @@ Expr: [ ] - Disable ability to parse inner structs, functions, constants etc. ? [ ] - Write up on order independent declarations +[ ] - constructor => thing :: (i: S32) -> {i = i, thing = 10} [ ] - Casting to basic types by call S64(x) [ ] - Default values in structs??? Should compound stmts bring values from default values?? Maybe not? Whats the alternative [ ] - Type aliases :: should probably be strictly typed, but assigning constant values should work @@ -101,7 +61,6 @@ Expr: [ ] - Rust like enum where you associate values(other structs) with keys [ ] - 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. [ ] - Conditional compilation #if @donzo diff --git a/parsing.cpp b/parsing.cpp index ce34c17..8a1d8ef 100644 --- a/parsing.cpp +++ b/parsing.cpp @@ -562,6 +562,7 @@ function Ast_Decl * parse_enum(Token *pos){ Scratch scratch; Ast_Expr *typespec = parse_optional_type(); + Token *flag = token_match_pound(intern_flag); token_match(OPEN_SCOPE); Ast_Scope *scope = begin_decl_scope(scratch, token_get()); @@ -577,6 +578,7 @@ parse_enum(Token *pos){ token_expect(CLOSE_SCOPE); Ast_Decl *result = ast_enum(pos, typespec, scope); + if(flag) set_flag(result->flags, AST_FLAG); return result; } @@ -595,13 +597,11 @@ parse_decl(B32 is_global){ } } - Ast_Flag flags = 0; Token *tname = token_get(); if(token_match(TK_Identifier, TK_DoubleColon)){ - if(token_match_pound(intern_strict)){ - set_flag(flags, AST_STRICT); - } else if(token_match_pound(intern_foreign)){ + Ast_Flag flags = 0; + if(token_match_pound(intern_foreign)){ set_flag(flags, AST_FOREIGN); } @@ -620,7 +620,8 @@ parse_decl(B32 is_global){ if(expr->kind == AST_LAMBDA_EXPR){ auto a = (Ast_Lambda *)expr; - if(a->scope){ + if(a->scope || is_flag_set(flags, AST_FOREIGN)){ + set_flag(result->flags, flags); result->kind = AST_LAMBDA; } } @@ -643,7 +644,6 @@ parse_decl(B32 is_global){ if(result){ result->name = tname->intern_val; - set_flag(result->flags, flags); } return result;