diff --git a/core_compiler.cpp b/core_compiler.cpp index 49438a4..c309ddf 100644 --- a/core_compiler.cpp +++ b/core_compiler.cpp @@ -5,35 +5,14 @@ lex_init(Allocator *token_string_arena, Allocator *map_allocator, Lexer *l){ l->tokens = array_make(token_string_arena, 1024*2); l->interns= intern_table_make(token_string_arena, map_allocator, 1024); - keyword_struct = l->intern("struct"_s); - keyword_union = l->intern("union"_s); - keyword_true = l->intern("true"_s); - keyword_default = l->intern("default"_s); - keyword_break = l->intern("break"_s); - keyword_false = l->intern("false"_s); - keyword_return = l->intern("return"_s); - keyword_switch = l->intern("switch"_s); - keyword_assert = l->intern("Assert"_s); - keyword_if = l->intern("if"_s); - keyword_elif = l->intern("elif"_s); - keyword_pass = l->intern("pass"_s); - keyword_else = l->intern("else"_s); - keyword_for = l->intern("for"_s); - keyword_enum = intern_string(&l->interns, "enum"_s); - l->interns.first_keyword = keyword_struct.str; - l->interns.last_keyword = keyword_enum.str; +/*#import meta +for i in meta.keywords: + print(f'keyword_{i.lower()} = l->intern("{i}"_s);') +print(f'l->interns.first_keyword = keyword_{meta.keywords[0].lower()}.str;') +print(f'l->interns.last_keyword = keyword_{meta.keywords[-1].lower()}.str;') - intern_sizeof = l->intern("SizeOf"_s); - intern_lengthof = l->intern("Length"_s); - intern_alignof = l->intern("AlignOf"_s); - intern_foreign = l->intern("foreign"_s); - intern_strict = l->intern("strict"_s); - intern_void = l->intern("void"_s); - intern_flag = l->intern("flag"_s); - intern_it = l->intern("it"_s); - -/*# -import meta +for i in meta.interns: + print(f'intern_{i.lower()} = l->intern("{i}"_s);') for i in meta.token_simple_expr: if i[1] != "SPECIAL": @@ -44,6 +23,31 @@ last = "op_" + meta.pascal_to_snake(meta.token_simple_expr[-1][0]) print(f"l->first_op = {first};") print(f"l->last_op = {last};") */ +keyword_struct = l->intern("struct"_s); +keyword_union = l->intern("union"_s); +keyword_true = l->intern("true"_s); +keyword_default = l->intern("default"_s); +keyword_break = l->intern("break"_s); +keyword_false = l->intern("false"_s); +keyword_return = l->intern("return"_s); +keyword_switch = l->intern("switch"_s); +keyword_assert = l->intern("Assert"_s); +keyword_if = l->intern("if"_s); +keyword_elif = l->intern("elif"_s); +keyword_pass = l->intern("pass"_s); +keyword_else = l->intern("else"_s); +keyword_for = l->intern("for"_s); +keyword_enum = l->intern("enum"_s); +l->interns.first_keyword = keyword_struct.str; +l->interns.last_keyword = keyword_enum.str; +intern_sizeof = l->intern("SizeOf"_s); +intern_length = l->intern("Length"_s); +intern_alignof = l->intern("AlignOf"_s); +intern_foreign = l->intern("foreign"_s); +intern_strict = l->intern("strict"_s); +intern_void = l->intern("void"_s); +intern_flag = l->intern("flag"_s); +intern_it = l->intern("it"_s); op_mul = l->intern("*"_s); op_div = l->intern("/"_s); op_mod = l->intern("%"_s); @@ -71,6 +75,7 @@ op_post_increment = l->intern("++"_s); l->first_op = op_mul; l->last_op = op_post_increment; /*END*/ + } function void diff --git a/core_globals.cpp b/core_globals.cpp index 518addc..b170a25 100644 --- a/core_globals.cpp +++ b/core_globals.cpp @@ -7,41 +7,37 @@ global S64 bigint_allocation_count; global Token token_null = {SAME_SCOPE}; global Token null_token; // @todo: memes, why the above is called null? -//----------------------------------------------------------------------------- -// Interns / keywords -//----------------------------------------------------------------------------- -Intern_String keyword_struct; // first -Intern_String keyword_union; -Intern_String keyword_return; -Intern_String keyword_if; -Intern_String keyword_else; -Intern_String keyword_true; -Intern_String keyword_false; -Intern_String keyword_for; -Intern_String keyword_pass; -Intern_String keyword_default; -Intern_String keyword_switch; -Intern_String keyword_break; -Intern_String keyword_elif; -Intern_String keyword_assert; -Intern_String keyword_enum; // last - -Intern_String intern_sizeof; -Intern_String intern_alignof; -Intern_String intern_lengthof; -Intern_String intern_void; -Intern_String intern_foreign; -Intern_String intern_it; -Intern_String intern_strict; -Intern_String intern_flag; - -/*# -import meta +/*#import meta +for i in meta.keywords: print(f'Intern_String keyword_{i.lower()};') +for i in meta.interns: print(f'Intern_String intern_{i.lower()};') for i in meta.token_simple_expr: if i[1] != "SPECIAL": print("Intern_String op_" + meta.pascal_to_snake(i[0]) + ";") */ +Intern_String keyword_struct; +Intern_String keyword_union; +Intern_String keyword_true; +Intern_String keyword_default; +Intern_String keyword_break; +Intern_String keyword_false; +Intern_String keyword_return; +Intern_String keyword_switch; +Intern_String keyword_assert; +Intern_String keyword_if; +Intern_String keyword_elif; +Intern_String keyword_pass; +Intern_String keyword_else; +Intern_String keyword_for; +Intern_String keyword_enum; +Intern_String intern_sizeof; +Intern_String intern_length; +Intern_String intern_alignof; +Intern_String intern_foreign; +Intern_String intern_strict; +Intern_String intern_void; +Intern_String intern_flag; +Intern_String intern_it; Intern_String op_mul; Intern_String op_div; Intern_String op_mod; diff --git a/core_typechecking.cpp b/core_typechecking.cpp index 855e394..9a1c3cb 100644 --- a/core_typechecking.cpp +++ b/core_typechecking.cpp @@ -1788,7 +1788,7 @@ resolve_expr(Ast_Expr *ast, Resolve_Flag flags, Ast_Type *compound_context){ return operand_const_rvalue(v); } - else if(expr_atom_is_equal_intern(node->name, intern_lengthof)){ + else if(expr_atom_is_equal_intern(node->name, intern_length)){ Ast_Expr *expr = unpack_ast_call_expr_for_builtin(node); Operand name = resolve_expr(expr, inherit_flag(flags, AST_CANT_BE_NULL)); diff --git a/meta.py b/meta.py index 4fd8cdd..3bcf040 100644 --- a/meta.py +++ b/meta.py @@ -89,4 +89,33 @@ token_rest = [ ["Keyword", "[Keyword]"], ] -token_kinds = token_simple_expr + token_assign_expr + token_rest \ No newline at end of file +token_kinds = token_simple_expr + token_assign_expr + token_rest + +keywords = [ + "struct", + "union", + "true", + "default", + "break", + "false", + "return", + "switch", + "Assert", + "if", + "elif", + "pass", + "else", + "for", + "enum", +] + +interns = [ + "SizeOf", + "Length", + "AlignOf", + "foreign", + "strict", + "void", + "flag", + "it", +] \ No newline at end of file