#pragma once #include "compiler.h" #include "vm.h" enum InputResult { NEED_MORE_LINES = 0, EXEC_DONE = 1, EXEC_SKIPPED = 2, }; class REPL: public PkExportedResource { protected: int need_more_lines = 0; std::string buffer; CompileMode mode; VM* vm; bool exited = false; void _exit(){ exited = true; exit(0); } public: REPL(VM* vm) : vm(vm){ (*vm->_stdout) << ("pocketpy " PK_VERSION " (" __DATE__ ", " __TIME__ ")\n"); (*vm->_stdout) << ("https://github.com/blueloveTH/pocketpy" "\n"); (*vm->_stdout) << ("Type \"exit()\" to exit." "\n"); } bool is_need_more_lines() const { return need_more_lines; } InputResult input(std::string line){ if(exited) return EXEC_SKIPPED; mode = SINGLE_MODE; if(need_more_lines){ buffer += line; buffer += '\n'; int n = buffer.size(); if(n>=need_more_lines){ for(int i=buffer.size()-need_more_lines; i", mode); if(code == nullptr) return EXEC_SKIPPED; vm->execAsync(code); return EXEC_DONE; }catch(NeedMoreLines& ne){ buffer += line; buffer += '\n'; need_more_lines = ne.isClassDef ? 3 : 2; return NEED_MORE_LINES; } } };