Backup, new approach to ast

This commit is contained in:
Krzosa Karol
2022-05-02 09:29:21 +02:00
parent c5498b03ad
commit 6d68fd07aa
8 changed files with 882 additions and 125 deletions

52
main.c
View File

@@ -81,7 +81,7 @@ parser_test(){
String exprs[] = {
lit("(4+2*53)"),
lit("((4+2)*53"),
lit("((4+2)*53)"),
lit("++5"),
lit("5--"), // @Todo(Krzosa):
lit("-5"),
@@ -95,18 +95,10 @@ parser_test(){
parser_lex_stream(&p, exprs[i], lit("File"));
Expr *expr = parse_expr(&p);
assert(expr);
expr_print(expr);
lex_print("\n");
//expr_print(expr);
//lex_print("\n");
}
/*
String decls =
lit("@Test(a=\"thing\") @str=\"based\" Thing:enum{ Thing_1 = 1<<10, Thing_2 = 10 }"
"TTT:struct{ thing:U64; nested:struct{ thing:S64; }}"
""
);
*/
String decls = os_read_file(lit("ast.h"));
parser_lex_stream(&p, decls, lit("File"));
AST_Node *node = parse(&p);
@@ -114,6 +106,32 @@ parser_test(){
assert(node->last_child);
ast_print(node);
for(AST_Node *n = node->first_child; n; n=n->next){
if(n->kind == AK_Enum){
AST_Node *prefix = ast_find_note(n, lit("prefix"));
lex_print("global String %s_metadata[] = {\n", n->name.s.str);
for(AST_Node *member = n->first_child; member; member=member->next){
lex_print("[");
if(prefix) expr_print(prefix->expr);
lex_print("%s] = ", member->name.s.str);
AST_Node *str = ast_find_note(member, lit("str"));
lex_print("lit(\"");
if(str){
expr_print(str->expr);
}
else {
lex_print("%s", member->name.s.str);
}
lex_print("\")");
lex_print(",\n");
}
lex_print("};\n");
}
else if(n->kind == AK_Struct){
gen_struct(n, (Intern_String){});
}
}
}
function S32
@@ -123,6 +141,18 @@ os_main(){
lex_test();
parser_test();
String_Map maps[] = {
{lit("cap"), lit("cap")},
{lit("len"), lit("len")},
{lit("data"), lit("tokens")},
{lit("parent_type"), lit("Tokens")},
{lit("parent_type_lower"), lit("tokens")},
{lit("var_type_lower"), lit("token")},
{lit("var_type"), lit("Token")},
{lit("var_name"), lit("tokens")},
};
/*
String keywords[]={
lit("S64"),