You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.5 KiB
84 lines
2.5 KiB
%{
|
|
|
|
#include <stdio.h>
|
|
|
|
#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
|
|
|
|
%x LEX_STATE_EXPORT_COMMON
|
|
%x LEX_STATE_EXPORT_SPLIT
|
|
%x LEX_STATE_EXPORT_SPLIT_FUNCTION
|
|
%x LEX_STATE_EXPORT_SPLIT_FUNCTION_BODY
|
|
%x LEX_STATE_EXPORT_OPTION
|
|
%x LEX_STATE_EXPORT_OPTION_2
|
|
|
|
%%
|
|
|
|
<INITIAL>. p(code_common);
|
|
<INITIAL>\n p(code_common);
|
|
|
|
<INITIAL>"$export_common " BEGIN(LEX_STATE_EXPORT_COMMON);
|
|
<INITIAL>"$$export_split " BEGIN(LEX_STATE_EXPORT_SPLIT);
|
|
<INITIAL>"$$export_split" BEGIN(LEX_STATE_EXPORT_SPLIT);
|
|
<INITIAL>"$export_option " printf("Exporting an option.\n"); BEGIN(LEX_STATE_EXPORT_OPTION);
|
|
|
|
<LEX_STATE_EXPORT_COMMON>. p(code_common); p(interface_common);
|
|
<LEX_STATE_EXPORT_COMMON>\n p(code_common); p(interface_common); BEGIN(INITIAL);
|
|
|
|
<LEX_STATE_EXPORT_SPLIT>"function" p(code_g); p(code_w); p(interface_g); p(interface_w); BEGIN(LEX_STATE_EXPORT_SPLIT_FUNCTION);
|
|
<LEX_STATE_EXPORT_SPLIT>"@" ps(code_g,"g"); ps(code_w,"w"); ps(interface_g,"g"); ps(interface_w,"w");
|
|
<LEX_STATE_EXPORT_SPLIT>"$$" BEGIN(INITIAL);
|
|
<LEX_STATE_EXPORT_SPLIT>(.|\n) p(code_g); p(code_w); p(interface_g); p(interface_w);
|
|
|
|
<LEX_STATE_EXPORT_SPLIT_FUNCTION>"{" p(code_g); p(code_w); ps(interface_g, "{return 0;}"); ps(interface_w, "{return 0;}"); BEGIN(LEX_STATE_EXPORT_SPLIT_FUNCTION_BODY);
|
|
<LEX_STATE_EXPORT_SPLIT_FUNCTION>"@" ps(code_g,"g"); ps(code_w,"w"); ps(interface_g,"g"); ps(interface_w,"w");
|
|
<LEX_STATE_EXPORT_SPLIT_FUNCTION>(.|\n) p(code_g); p(code_w); p(interface_g); p(interface_w);
|
|
<LEX_STATE_EXPORT_SPLIT_FUNCTION_BODY>"@" ps(code_g,"g"); ps(code_w,"w");
|
|
<LEX_STATE_EXPORT_SPLIT_FUNCTION_BODY>"$$" BEGIN(INITIAL);
|
|
<LEX_STATE_EXPORT_SPLIT_FUNCTION_BODY>(.|\n) p(code_g); p(code_w);
|
|
|
|
<LEX_STATE_EXPORT_OPTION>"$" BEGIN(LEX_STATE_EXPORT_OPTION_2);
|
|
<LEX_STATE_EXPORT_OPTION>(.|\n) p(code_g); p(interface_g);
|
|
<LEX_STATE_EXPORT_OPTION_2>"$" BEGIN(INITIAL);
|
|
<LEX_STATE_EXPORT_OPTION_2>(.|\n) p(code_w); p(interface_w);
|
|
|
|
|
|
%%
|
|
|
|
int main(int argn, char** argv)
|
|
{
|
|
if(argn < 7)
|
|
{
|
|
printf("Give output file as argument.\n");
|
|
return 1;
|
|
}
|
|
|
|
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(code_common);
|
|
fclose(code_g);
|
|
fclose(code_w);
|
|
fclose(interface_common);
|
|
fclose(interface_g);
|
|
fclose(interface_w);
|
|
|
|
return 0;
|
|
}
|
|
|