More generation from meta data

This commit is contained in:
Krzosa Karol
2022-09-30 09:16:53 +02:00
parent ff7a30b806
commit 5e149dfca3
4 changed files with 90 additions and 60 deletions

View File

@@ -5,6 +5,24 @@ lex_init(Allocator *token_string_arena, Allocator *map_allocator, Lexer *l){
l->tokens = array_make<Token>(token_string_arena, 1024*2); l->tokens = array_make<Token>(token_string_arena, 1024*2);
l->interns= intern_table_make(token_string_arena, map_allocator, 1024); l->interns= intern_table_make(token_string_arena, map_allocator, 1024);
/*#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;')
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":
print("op_" + meta.pascal_to_snake(i[0]) + f' = l->intern("{i[1]}"_s);')
first = "op_" + meta.pascal_to_snake(meta.token_simple_expr[0][0])
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_struct = l->intern("struct"_s);
keyword_union = l->intern("union"_s); keyword_union = l->intern("union"_s);
keyword_true = l->intern("true"_s); keyword_true = l->intern("true"_s);
@@ -19,31 +37,17 @@ lex_init(Allocator *token_string_arena, Allocator *map_allocator, Lexer *l){
keyword_pass = l->intern("pass"_s); keyword_pass = l->intern("pass"_s);
keyword_else = l->intern("else"_s); keyword_else = l->intern("else"_s);
keyword_for = l->intern("for"_s); keyword_for = l->intern("for"_s);
keyword_enum = intern_string(&l->interns, "enum"_s); keyword_enum = l->intern("enum"_s);
l->interns.first_keyword = keyword_struct.str; l->interns.first_keyword = keyword_struct.str;
l->interns.last_keyword = keyword_enum.str; l->interns.last_keyword = keyword_enum.str;
intern_sizeof = l->intern("SizeOf"_s); intern_sizeof = l->intern("SizeOf"_s);
intern_lengthof = l->intern("Length"_s); intern_length = l->intern("Length"_s);
intern_alignof = l->intern("AlignOf"_s); intern_alignof = l->intern("AlignOf"_s);
intern_foreign = l->intern("foreign"_s); intern_foreign = l->intern("foreign"_s);
intern_strict = l->intern("strict"_s); intern_strict = l->intern("strict"_s);
intern_void = l->intern("void"_s); intern_void = l->intern("void"_s);
intern_flag = l->intern("flag"_s); intern_flag = l->intern("flag"_s);
intern_it = l->intern("it"_s); intern_it = l->intern("it"_s);
/*#
import meta
for i in meta.token_simple_expr:
if i[1] != "SPECIAL":
print("op_" + meta.pascal_to_snake(i[0]) + f' = l->intern("{i[1]}"_s);')
first = "op_" + meta.pascal_to_snake(meta.token_simple_expr[0][0])
last = "op_" + meta.pascal_to_snake(meta.token_simple_expr[-1][0])
print(f"l->first_op = {first};")
print(f"l->last_op = {last};")
*/
op_mul = l->intern("*"_s); op_mul = l->intern("*"_s);
op_div = l->intern("/"_s); op_div = l->intern("/"_s);
op_mod = l->intern("%"_s); op_mod = l->intern("%"_s);
@@ -71,6 +75,7 @@ op_post_increment = l->intern("++"_s);
l->first_op = op_mul; l->first_op = op_mul;
l->last_op = op_post_increment; l->last_op = op_post_increment;
/*END*/ /*END*/
} }
function void function void

View File

@@ -7,41 +7,37 @@ global S64 bigint_allocation_count;
global Token token_null = {SAME_SCOPE}; global Token token_null = {SAME_SCOPE};
global Token null_token; // @todo: memes, why the above is called null? global Token null_token; // @todo: memes, why the above is called null?
//----------------------------------------------------------------------------- /*#import meta
// Interns / keywords for i in meta.keywords: print(f'Intern_String keyword_{i.lower()};')
//----------------------------------------------------------------------------- for i in meta.interns: print(f'Intern_String intern_{i.lower()};')
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
for i in meta.token_simple_expr: for i in meta.token_simple_expr:
if i[1] != "SPECIAL": if i[1] != "SPECIAL":
print("Intern_String op_" + meta.pascal_to_snake(i[0]) + ";") 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_mul;
Intern_String op_div; Intern_String op_div;
Intern_String op_mod; Intern_String op_mod;

View File

@@ -1788,7 +1788,7 @@ resolve_expr(Ast_Expr *ast, Resolve_Flag flags, Ast_Type *compound_context){
return operand_const_rvalue(v); 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); Ast_Expr *expr = unpack_ast_call_expr_for_builtin(node);
Operand name = resolve_expr(expr, inherit_flag(flags, AST_CANT_BE_NULL)); Operand name = resolve_expr(expr, inherit_flag(flags, AST_CANT_BE_NULL));

29
meta.py
View File

@@ -90,3 +90,32 @@ token_rest = [
] ]
token_kinds = token_simple_expr + token_assign_expr + token_rest 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",
]