repl.cpp 1.3 KB

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