More generation from meta data
This commit is contained in:
@@ -5,35 +5,14 @@ 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);
|
||||||
|
|
||||||
keyword_struct = l->intern("struct"_s);
|
/*#import meta
|
||||||
keyword_union = l->intern("union"_s);
|
for i in meta.keywords:
|
||||||
keyword_true = l->intern("true"_s);
|
print(f'keyword_{i.lower()} = l->intern("{i}"_s);')
|
||||||
keyword_default = l->intern("default"_s);
|
print(f'l->interns.first_keyword = keyword_{meta.keywords[0].lower()}.str;')
|
||||||
keyword_break = l->intern("break"_s);
|
print(f'l->interns.last_keyword = keyword_{meta.keywords[-1].lower()}.str;')
|
||||||
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;
|
|
||||||
|
|
||||||
intern_sizeof = l->intern("SizeOf"_s);
|
for i in meta.interns:
|
||||||
intern_lengthof = l->intern("Length"_s);
|
print(f'intern_{i.lower()} = l->intern("{i}"_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.token_simple_expr:
|
for i in meta.token_simple_expr:
|
||||||
if i[1] != "SPECIAL":
|
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->first_op = {first};")
|
||||||
print(f"l->last_op = {last};")
|
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_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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
29
meta.py
@@ -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",
|
||||||
|
]
|
||||||
Reference in New Issue
Block a user