123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #include "hellovm.h"
- void runCodeFile(Inter *inter, char *file[]) {
- Statement *pst = NULL;
- Result result;
- bool should_break = false;
- setResultCore(&result);
- for (PASS; !should_break && *file != NULL; file++) {
- int status;
- if ((status = checkFileReadable((*file))) == 3)
- continue;
- else if (status == 2) {
- *file = memStrcat(*file, ((*file)[memStrlen(*file) - 1] != SEP_CH ? SEP"__main__.vm" : "__main__.vm"), false, false);
- if (checkFileReadable(*file) != 1)
- continue;
- }
- if (runParser(*file, inter, false, &pst)) {
- changeInterEnv(*file, true, inter); // 设置运行环境
- globalIterStatement(&result, inter, pst, true);
- if (result.type == R_error) {
- printError(&result, inter, args.p_clock);
- should_break = true;
- }
- freeStatement(pst);
- freeResult(&result);
- }
- }
- }
- void runCodeStdin(Inter *inter, char *hello_string) {
- Statement *pst = NULL;
- Result result;
- bool should_break = false;
- setResultCore(&result);
- if (hello_string != NULL)
- printf("%s", hello_string);
- while (!should_break){
- if (ferror(stdin) || feof(stdin))
- clearerr(stdin);
- fprintf(stdout, ">>> ");
- if (runParser(NULL, inter, true, &pst)) {
- globalIterStatement(&result, inter, pst, false);
- if (result.type == R_error && !(should_break = is_quitExc(result.value, inter)))
- printError(&result, inter, true);
- freeStatement(pst);
- freeResult(&result);
- }
- }
- }
- bool runParser(char *code_file, Inter *inter, bool is_one, Statement **st) {
- ParserMessage *pm = makeParserMessageFile(code_file, is_one);
- *st = makeStatement(0, (code_file == NULL) ? "stdin" : code_file);
- parserCommandList(pm, inter, true, *st);
- if (pm->status == int_error) {
- fprintf(stderr, "KeyInterrupt\n");
- } else if (pm->status != success)
- fprintf(stderr, "Syntax Error: %s\n", pm->status_message);
- else {
- freeParserMessage(pm, true);
- return true;
- }
- freeStatement(*st);
- freeParserMessage(pm, true);
- *st = NULL;
- return false;
- }
|