您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

84 行
2.5 KiB

  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. %x LEX_STATE_EXPORT_OPTION
  18. %x LEX_STATE_EXPORT_OPTION_2
  19. %%
  20. <INITIAL>. p(code_common);
  21. <INITIAL>\n p(code_common);
  22. <INITIAL>"$export_common " BEGIN(LEX_STATE_EXPORT_COMMON);
  23. <INITIAL>"$$export_split " BEGIN(LEX_STATE_EXPORT_SPLIT);
  24. <INITIAL>"$$export_split" BEGIN(LEX_STATE_EXPORT_SPLIT);
  25. <INITIAL>"$export_option " printf("Exporting an option.\n"); BEGIN(LEX_STATE_EXPORT_OPTION);
  26. <LEX_STATE_EXPORT_COMMON>. p(code_common); p(interface_common);
  27. <LEX_STATE_EXPORT_COMMON>\n p(code_common); p(interface_common); BEGIN(INITIAL);
  28. <LEX_STATE_EXPORT_SPLIT>"function" p(code_g); p(code_w); p(interface_g); p(interface_w); BEGIN(LEX_STATE_EXPORT_SPLIT_FUNCTION);
  29. <LEX_STATE_EXPORT_SPLIT>"@" ps(code_g,"g"); ps(code_w,"w"); ps(interface_g,"g"); ps(interface_w,"w");
  30. <LEX_STATE_EXPORT_SPLIT>"$$" BEGIN(INITIAL);
  31. <LEX_STATE_EXPORT_SPLIT>(.|\n) p(code_g); p(code_w); p(interface_g); p(interface_w);
  32. <LEX_STATE_EXPORT_SPLIT_FUNCTION>"{" p(code_g); p(code_w); ps(interface_g, "{return 0;}\n"); ps(interface_w, "{return 0;}\n"); BEGIN(LEX_STATE_EXPORT_SPLIT_FUNCTION_BODY);
  33. <LEX_STATE_EXPORT_SPLIT_FUNCTION>"@" ps(code_g,"g"); ps(code_w,"w"); ps(interface_g,"g"); ps(interface_w,"w");
  34. <LEX_STATE_EXPORT_SPLIT_FUNCTION>(.|\n) p(code_g); p(code_w); p(interface_g); p(interface_w);
  35. <LEX_STATE_EXPORT_SPLIT_FUNCTION_BODY>"@" ps(code_g,"g"); ps(code_w,"w");
  36. <LEX_STATE_EXPORT_SPLIT_FUNCTION_BODY>"$$" BEGIN(INITIAL);
  37. <LEX_STATE_EXPORT_SPLIT_FUNCTION_BODY>(.|\n) p(code_g); p(code_w);
  38. <LEX_STATE_EXPORT_OPTION>"$" BEGIN(LEX_STATE_EXPORT_OPTION_2);
  39. <LEX_STATE_EXPORT_OPTION>(.|\n) p(code_g); p(interface_g);
  40. <LEX_STATE_EXPORT_OPTION_2>"$" BEGIN(INITIAL);
  41. <LEX_STATE_EXPORT_OPTION_2>(.|\n) p(code_w); p(interface_w);
  42. %%
  43. int main(int argn, char** argv)
  44. {
  45. if(argn < 7)
  46. {
  47. printf("Give output file as argument.\n");
  48. return 1;
  49. }
  50. code_common = fopen(argv[1], "w");
  51. code_g = fopen(argv[2], "w");
  52. code_w = fopen(argv[3], "w");
  53. interface_common = fopen(argv[4], "w");
  54. interface_g = fopen(argv[5], "w");
  55. interface_w = fopen(argv[6], "w");
  56. yylex();
  57. fclose(code_common);
  58. fclose(code_g);
  59. fclose(code_w);
  60. fclose(interface_common);
  61. fclose(interface_g);
  62. fclose(interface_w);
  63. return 0;
  64. }