AST idea
This commit is contained in:
48
generate.c
48
generate.c
@@ -13,24 +13,54 @@
|
||||
|
||||
#include "new_lex.c"
|
||||
|
||||
int main(){
|
||||
|
||||
FILE *f = fopen("generated.c", "w");
|
||||
assert(f);
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// String replacing util
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef struct String_Map String_Map;
|
||||
struct String_Map{
|
||||
String replace;
|
||||
String with;
|
||||
};
|
||||
|
||||
function void
|
||||
output_template(FILE *f, String filename, String_Map *map, SizeU map_cap){
|
||||
Arena *scratch = arena_begin_scratch();
|
||||
String file = os_read_file(scratch, lit("token_array.c"));
|
||||
Token_Array array = lex_stream(scratch, file, lit("token_array.c"));
|
||||
for(Token *t = token_array_iter_begin(&array); t; t = token_array_iter_next(&array)){
|
||||
String file = os_read_file(scratch, filename);
|
||||
Token_Array array = lex_stream(scratch, file, filename);
|
||||
for(Token *t = token_array_iter_begin(&array); t->kind != TK_End; t = token_array_iter_next(&array)){
|
||||
String string = t->string;
|
||||
for(SizeU i = 0; i < map_cap; i++){
|
||||
if(string_compare(string, map[i].replace)){
|
||||
string = map[i].with;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(f, "%.*s", (int)t->len, t->str);
|
||||
|
||||
fprintf(f, "%.*s", (int)string.len, string.str);
|
||||
if(t->kind == TK_OpenBrace) fprintf(f, "\n");
|
||||
if(t->kind == TK_CloseBrace && token_array_iter_peek(&array, 0)->kind != TK_Semicolon) fprintf(f, "\n");
|
||||
if(t->kind == TK_Semicolon) fprintf(f, "\n");
|
||||
if(t->kind == TK_Keyword) fprintf(f, " ");
|
||||
if(t[0].kind == TK_Identifier && token_array_iter_peek(&array, 0)->kind == TK_Identifier) fprintf(f, " ");
|
||||
token_array_iter_peek(&array, 1);
|
||||
}
|
||||
arena_end_scratch();
|
||||
}
|
||||
|
||||
int main(){
|
||||
|
||||
FILE *f = fopen("generated.c", "w");
|
||||
assert(f);
|
||||
String_Map map[] = {
|
||||
{lit("Type"), lit("Decl")},
|
||||
{lit("first"), lit("list_decl.first")},
|
||||
{lit("last"), lit("list_decl.last")},
|
||||
{lit("remove"), lit("decl_list_remove")},
|
||||
{lit("push_front"), lit("decl_dll_list_push_front")},
|
||||
{lit("push"), lit("decl_dll_list_push")},
|
||||
};
|
||||
output_template(f, lit("dllqueue.c"), map, buff_cap(map));
|
||||
|
||||
fclose(f);
|
||||
}
|
||||
Reference in New Issue
Block a user