repl.h 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #pragma once
  2. #include "compiler.h"
  3. #include "vm.h"
  4. class REPL {
  5. protected:
  6. int need_more_lines = 0;
  7. std::string buffer;
  8. VM* vm;
  9. public:
  10. REPL(VM* vm) : vm(vm){
  11. (*vm->_stdout) << ("pocketpy " PK_VERSION " (" __DATE__ ", " __TIME__ ")\n");
  12. (*vm->_stdout) << ("https://github.com/blueloveTH/pocketpy" "\n");
  13. (*vm->_stdout) << ("Type \"exit()\" to exit." "\n");
  14. }
  15. bool input(std::string line){
  16. CompileMode mode = SINGLE_MODE;
  17. if(need_more_lines){
  18. buffer += line;
  19. buffer += '\n';
  20. int n = buffer.size();
  21. if(n>=need_more_lines){
  22. for(int i=buffer.size()-need_more_lines; i<buffer.size(); i++){
  23. if(buffer[i] != '\n') goto __NOT_ENOUGH_LINES;
  24. }
  25. need_more_lines = 0;
  26. line = buffer;
  27. buffer.clear();
  28. mode = EXEC_MODE;
  29. }else{
  30. __NOT_ENOUGH_LINES:
  31. return true;
  32. }
  33. }
  34. try{
  35. vm->exec(line, "<stdin>", mode);
  36. }catch(NeedMoreLines& ne){
  37. buffer += line;
  38. buffer += '\n';
  39. need_more_lines = ne.isClassDef ? 3 : 2;
  40. if (need_more_lines) return true;
  41. }
  42. return false;
  43. }
  44. };