virtualmath.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "hellovm.h"
  2. void runCodeFile(Inter *inter, char *file[]) {
  3. Statement *pst = NULL;
  4. Result result;
  5. bool should_break = false;
  6. setResultCore(&result);
  7. for (PASS; !should_break && *file != NULL; file++) {
  8. int status;
  9. if ((status = checkFileReadable((*file))) == 3)
  10. continue;
  11. else if (status == 2) {
  12. *file = memStrcat(*file, ((*file)[memStrlen(*file) - 1] != SEP_CH ? SEP"__main__.vm" : "__main__.vm"), false, false);
  13. if (checkFileReadable(*file) != 1)
  14. continue;
  15. }
  16. if (runParser(*file, inter, false, &pst)) {
  17. changeInterEnv(*file, true, inter); // 设置运行环境
  18. globalIterStatement(&result, inter, pst, true);
  19. if (result.type == R_error) {
  20. printError(&result, inter, args.p_clock);
  21. should_break = true;
  22. }
  23. freeStatement(pst);
  24. freeResult(&result);
  25. }
  26. }
  27. }
  28. void runCodeStdin(Inter *inter, char *hello_string) {
  29. Statement *pst = NULL;
  30. Result result;
  31. bool should_break = false;
  32. setResultCore(&result);
  33. if (hello_string != NULL)
  34. printf("%s", hello_string);
  35. while (!should_break){
  36. if (ferror(stdin) || feof(stdin))
  37. clearerr(stdin);
  38. fprintf(stdout, ">>> ");
  39. if (runParser(NULL, inter, true, &pst)) {
  40. globalIterStatement(&result, inter, pst, false);
  41. if (result.type == R_error && !(should_break = is_quitExc(result.value, inter)))
  42. printError(&result, inter, true);
  43. freeStatement(pst);
  44. freeResult(&result);
  45. }
  46. }
  47. }
  48. bool runParser(char *code_file, Inter *inter, bool is_one, Statement **st) {
  49. ParserMessage *pm = makeParserMessageFile(code_file, is_one);
  50. *st = makeStatement(0, (code_file == NULL) ? "stdin" : code_file);
  51. parserCommandList(pm, inter, true, *st);
  52. if (pm->status == int_error) {
  53. fprintf(stderr, "KeyInterrupt\n");
  54. } else if (pm->status != success)
  55. fprintf(stderr, "Syntax Error: %s\n", pm->status_message);
  56. else {
  57. freeParserMessage(pm, true);
  58. return true;
  59. }
  60. freeStatement(*st);
  61. freeParserMessage(pm, true);
  62. *st = NULL;
  63. return false;
  64. }