From 8963ad48fc98e6d93c68a6b790a8862d9d7f1f40 Mon Sep 17 00:00:00 2001 From: zelaven Date: Sat, 1 Feb 2020 18:52:14 +0100 Subject: [PATCH] Metatool *should* be finished --- meta_src/scanner.l | 67 +++++++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/meta_src/scanner.l b/meta_src/scanner.l index aa00cc3..eac9e91 100644 --- a/meta_src/scanner.l +++ b/meta_src/scanner.l @@ -2,49 +2,74 @@ #include -FILE* outfile1 = NULL; -FILE* outfile2 = NULL; -FILE* interface_file = NULL; +#define p(f) (fprintf(f, "%s", yytext)); +#define ps(f, s) (fprintf(f, s)); + +FILE* code_common = NULL; +FILE* code_g = NULL; +FILE* code_w = NULL; +FILE* interface_common = NULL; +FILE* interface_w = NULL; +FILE* interface_g = NULL; %} %option noyywrap -%option nounput -%option noinput -%x LEX_STATE_EXPORT -%x LEX_STATE_EXPORT_FUNCTION +%x LEX_STATE_EXPORT_COMMON +%x LEX_STATE_EXPORT_SPLIT +%x LEX_STATE_EXPORT_SPLIT_FUNCTION +%x LEX_STATE_EXPORT_SPLIT_FUNCTION_BODY %% -. fprintf(outfile1, "%s", yytext); fprintf(outfile2, "%s", yytext); -\n fprintf(outfile1, "%s", yytext); fprintf(outfile2, "%s", yytext); -"$export_split" BEGIN(LEX_STATE_EXPORT); +. p(code_common); +\n p(code_common); + +"$export_common " BEGIN(LEX_STATE_EXPORT_COMMON); +"$$export_split " BEGIN(LEX_STATE_EXPORT_SPLIT); + +. p(code_common); p(interface_common); +\n p(code_common); p(interface_common); BEGIN(INITIAL); + +"function" p(code_g); p(code_w); p(interface_g); p(interface_w); BEGIN(LEX_STATE_EXPORT_SPLIT_FUNCTION); +"@" ps(code_g,"g"); ps(code_w,"w"); ps(interface_g,"g"); ps(interface_w,"w"); +"$$" BEGIN(INITIAL); +. p(code_g); p(code_w); p(interface_g); p(interface_w); + +"{" p(code_g); p(code_w); ps(interface_g, "{return 0;}"); ps(interface_w, "{return 0;}"); BEGIN(LEX_STATE_EXPORT_SPLIT_FUNCTION_BODY); +"@" ps(code_g,"g"); ps(code_w,"w"); ps(interface_g,"g"); ps(interface_w,"w"); +(.|\n) p(code_g); p(code_w); p(interface_g); p(interface_w); +"@" ps(code_g,"g"); ps(code_w,"w"); +"$$" BEGIN(INITIAL); +. p(code_g); p(code_w); -"function" fprintf(outfile1, "function"); fprintf(outfile2, "function"); fprintf(interface_file, "function"); BEGIN(LEX_STATE_EXPORT_FUNCTION); -"{" fprintf(outfile1, "{"); fprintf(outfile2, "{"); fprintf(interface_file, "{return 0;}"); BEGIN(INITIAL); -(.|\n) fprintf(outfile1, "%s", yytext); fprintf(outfile2, "%s", yytext); fprintf(interface_file, "%s", yytext); -\n fprintf(outfile1, "\n"); fprintf(outfile2, "\n"); fprintf(interface_file, "\n"); BEGIN(INITIAL); %% int main(int argn, char** argv) { - if(argn < 4) + if(argn < 7) { printf("Give output file as argument.\n"); return 1; } - outfile1 = fopen(argv[1], "w"); - outfile2 = fopen(argv[2], "w"); - interface_file = fopen(argv[3], "w"); + code_common = fopen(argv[1], "w"); + code_g = fopen(argv[2], "w"); + code_w = fopen(argv[3], "w"); + interface_common = fopen(argv[4], "w"); + interface_g = fopen(argv[5], "w"); + interface_w = fopen(argv[6], "w"); yylex(); - fclose(outfile1); - fclose(outfile2); - fclose(interface_file); + fclose(code_common); + fclose(code_g); + fclose(code_w); + fclose(interface_common); + fclose(interface_g); + fclose(interface_w); return 0; }