mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
52 lines
1.3 KiB
C++
52 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include "compiler.h"
|
|
#include "ceval.h"
|
|
|
|
namespace pkpy{
|
|
|
|
class REPL {
|
|
protected:
|
|
int need_more_lines = 0;
|
|
std::string buffer;
|
|
VM* vm;
|
|
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 input(std::string line){
|
|
CompileMode mode = REPL_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<buffer.size(); i++){
|
|
// no enough lines
|
|
if(buffer[i] != '\n') return true;
|
|
}
|
|
need_more_lines = 0;
|
|
line = buffer;
|
|
buffer.clear();
|
|
mode = EXEC_MODE;
|
|
}else{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
try{
|
|
vm->exec(line, "<stdin>", mode);
|
|
}catch(NeedMoreLines& ne){
|
|
buffer += line;
|
|
buffer += '\n';
|
|
need_more_lines = ne.is_compiling_class ? 3 : 2;
|
|
if (need_more_lines) return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
} // namespace pkpy
|