mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 03:50:16 +00:00
68 lines
1.7 KiB
C++
68 lines
1.7 KiB
C++
#pragma once
|
|
|
|
#include "compiler.h"
|
|
#include "vm.h"
|
|
|
|
enum InputResult {
|
|
NEED_MORE_LINES = 0,
|
|
EXEC_DONE = 1,
|
|
EXEC_SKIPPED = 2,
|
|
};
|
|
|
|
class REPL {
|
|
protected:
|
|
int need_more_lines = 0;
|
|
std::string buffer;
|
|
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;
|
|
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++){
|
|
if(buffer[i] != '\n') goto __NOT_ENOUGH_LINES;
|
|
}
|
|
need_more_lines = 0;
|
|
line = buffer;
|
|
buffer.clear();
|
|
}else{
|
|
__NOT_ENOUGH_LINES:
|
|
return NEED_MORE_LINES;
|
|
}
|
|
}else{
|
|
if(line == "exit()") _exit();
|
|
if(line.empty()) return EXEC_SKIPPED;
|
|
}
|
|
|
|
try{
|
|
_Code code = compile(vm, line.c_str(), "<stdin>", SINGLE_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;
|
|
}
|
|
}
|
|
}; |