repl.h 1.3 KB

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