main.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "__virtualmath.h"
  2. static const struct option long_option[]={
  3. {"input",required_argument,NULL,'i'},
  4. {"stdout",no_argument,NULL,'s'},
  5. #if OUT_LOG
  6. {"log",required_argument,NULL,'l'},
  7. {"debug",no_argument,&args.level,DEBUG},
  8. {"ddebug",no_argument,&args.level,DEEP_DEBUG},
  9. {"ldebug",no_argument,&args.level,LEXICAL_DEBUG},
  10. {"lcdebug",no_argument,&args.level,LEXICAL_CHECKOUT_DEBUG},
  11. {"info",no_argument,&args.level,INFO},
  12. #endif
  13. // 最后一个元素应该全为0
  14. {NULL,0,NULL,0}
  15. };
  16. #if OUT_LOG
  17. static const char *short_option = "si:l:";
  18. #else
  19. static const char *short_option = "si:";
  20. #endif
  21. int getArgs(int argc, char *argv[]);
  22. void freeArgs();
  23. int main(int argc, char *argv[]) {
  24. printf("[start VirtualMath]\n");
  25. if (getArgs(argc, argv)){
  26. goto args_error_;
  27. }
  28. Inter *global_iter = makeInter(args.log_file);
  29. ParserMessage *pm = makeParserMessage(args.file, args.log_file);
  30. printf("[start to lexical]\n");
  31. parserCommandList(pm, global_iter, true, global_iter->statement);
  32. if (pm->status != success){
  33. writeLog(pm->paser_debug, ERROR, "Syntax Error: %s\n", pm->status_message);
  34. writeLog(stderr, ERROR, "Syntax Error: %s\n", pm->status_message);
  35. goto return_;
  36. }
  37. printf("[start to run]\n");
  38. Result tmp;
  39. tmp = globalIterStatement(global_iter);
  40. if (tmp.type == error_return){
  41. writeLog(global_iter->debug, ERROR, "Run Error\n", NULL);
  42. writeLog(stderr, ERROR, "Run Error\n", NULL);
  43. }
  44. return_:
  45. freeParserMessage(pm, true);
  46. freeInter(global_iter, true);
  47. freeArgs();
  48. printf("[exit Virtual [0]]\n");
  49. return 0;
  50. args_error_:
  51. freeArgs();
  52. printf("[exit Virtual [1]]\n");
  53. return 1;
  54. }
  55. /**
  56. * 参数设置, args是全局结构体, 保存全局的参数设置
  57. * @param argc
  58. * @param argv
  59. * @return
  60. */
  61. int getArgs(int argc, char *argv[])
  62. {
  63. args.file = NULL;
  64. args.log_file = NULL;
  65. args.level = LEXICAL_CHECKOUT_DEBUG;
  66. args.stdout_inter = false;
  67. opterr = false;
  68. int opt;
  69. while((opt=getopt_long(argc,argv,short_option ,long_option,NULL))!=-1)
  70. {
  71. switch(opt)
  72. {
  73. case 0:
  74. break;
  75. case 'i':
  76. args.file = memStrcpy(optarg, 0, false, false);
  77. break;
  78. case 'l':
  79. args.log_file = memStrcpy(optarg, 0, false, false);
  80. break;
  81. case 's':
  82. args.stdout_inter = true;
  83. break;
  84. case '?':
  85. printf("[Error]: get not success args : -%c\n", (char)optopt);
  86. return -1;
  87. default:
  88. break;
  89. }
  90. }
  91. if (args.file == NULL){
  92. if (argc > optind){
  93. args.file = memStrcpy(argv[optind], 0, false, false);
  94. }
  95. else{
  96. return -1;
  97. }
  98. }
  99. return 0;
  100. }
  101. /**
  102. * 释放args的成员而不包括其本身
  103. */
  104. void freeArgs(){
  105. memFree(args.file);
  106. memFree(args.file);
  107. }
  108. /*
  109. * TODO-szh try...except 分支
  110. * TODO-szh 抛出异常
  111. * TODO-szh restart语句
  112. * TODO-szh 函数参数
  113. * TODO-szh 列表、字典
  114. */