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.

75 lines
2.1 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. %{
  2. #include <stdio.h>
  3. #define p(f) (fprintf(f, "%s", yytext));
  4. #define ps(f, s) (fprintf(f, s));
  5. FILE* code_common = NULL;
  6. FILE* code_g = NULL;
  7. FILE* code_w = NULL;
  8. FILE* interface_common = NULL;
  9. FILE* interface_w = NULL;
  10. FILE* interface_g = NULL;
  11. %}
  12. %option noyywrap
  13. %x LEX_STATE_EXPORT_COMMON
  14. %x LEX_STATE_EXPORT_SPLIT
  15. %x LEX_STATE_EXPORT_SPLIT_FUNCTION
  16. %x LEX_STATE_EXPORT_SPLIT_FUNCTION_BODY
  17. %%
  18. <INITIAL>. p(code_common);
  19. <INITIAL>\n p(code_common);
  20. <INITIAL>"$export_common " BEGIN(LEX_STATE_EXPORT_COMMON);
  21. <INITIAL>"$$export_split " BEGIN(LEX_STATE_EXPORT_SPLIT);
  22. <LEX_STATE_EXPORT_COMMON>. p(code_common); p(interface_common);
  23. <LEX_STATE_EXPORT_COMMON>\n p(code_common); p(interface_common); BEGIN(INITIAL);
  24. <LEX_STATE_EXPORT_SPLIT>"function" p(code_g); p(code_w); p(interface_g); p(interface_w); BEGIN(LEX_STATE_EXPORT_SPLIT_FUNCTION);
  25. <LEX_STATE_EXPORT_SPLIT>"@" ps(code_g,"g"); ps(code_w,"w"); ps(interface_g,"g"); ps(interface_w,"w");
  26. <LEX_STATE_EXPORT_SPLIT>"$$" BEGIN(INITIAL);
  27. <LEX_STATE_EXPORT_SPLIT>. p(code_g); p(code_w); p(interface_g); p(interface_w);
  28. <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);
  29. <LEX_STATE_EXPORT_SPLIT_FUNCTION>"@" ps(code_g,"g"); ps(code_w,"w"); ps(interface_g,"g"); ps(interface_w,"w");
  30. <LEX_STATE_EXPORT_SPLIT_FUNCTION>(.|\n) p(code_g); p(code_w); p(interface_g); p(interface_w);
  31. <LEX_STATE_EXPORT_SPLIT_FUNCTION_BODY>"@" ps(code_g,"g"); ps(code_w,"w");
  32. <LEX_STATE_EXPORT_SPLIT_FUNCTION_BODY>"$$" BEGIN(INITIAL);
  33. <LEX_STATE_EXPORT_SPLIT_FUNCTION_BODY>(.|\n) p(code_g); p(code_w);
  34. %%
  35. int main(int argn, char** argv)
  36. {
  37. if(argn < 7)
  38. {
  39. printf("Give output file as argument.\n");
  40. return 1;
  41. }
  42. code_common = fopen(argv[1], "w");
  43. code_g = fopen(argv[2], "w");
  44. code_w = fopen(argv[3], "w");
  45. interface_common = fopen(argv[4], "w");
  46. interface_g = fopen(argv[5], "w");
  47. interface_w = fopen(argv[6], "w");
  48. yylex();
  49. fclose(code_common);
  50. fclose(code_g);
  51. fclose(code_w);
  52. fclose(interface_common);
  53. fclose(interface_g);
  54. fclose(interface_w);
  55. return 0;
  56. }