soulik icon

Simple

soulik | PRO | 03/07/16 07:19:09 PM UTC | 0 ⭐ | 307 👁️ | Never ⏰ | []
C++ |

1.83 KB

|

None

|

0 👍

/

0 👎

#include <iostream>
#include <stdint.h>
#include <string>
#include <functional>
#include <map>
#include <vector>
#include <queue>
 
using namespace std;
 
typedef map<string, function<void()>> instrukcia_t;
 
class VM {
private:
    instrukcia_t instrukcie;
    size_t pozicia_v_programe;
    size_t pozicia_v_RAM;
 
public:
    vector<char> RAM;
    queue<string> program;
 
    VM & operator<<(const string & vstup);
 
    void spusti();
    
    VM();
};
 
VM::VM(){
    pozicia_v_programe = 0;
    pozicia_v_RAM = 0;
    RAM = vector<char>(256, 0);
    
    instrukcie["<"] = [this](){
        pozicia_v_RAM--;
    };
    instrukcie[">"] = [this](){
        pozicia_v_RAM++;
    };
    instrukcie["+"] = [this](){
        RAM[pozicia_v_RAM]++;
    };
    instrukcie["-"] = [this](){
        RAM[pozicia_v_RAM]--;
    };
    instrukcie["."] = [this](){
        cout << RAM[pozicia_v_RAM];
    };
}
 
VM & VM::operator<<(const string & vstup){
    program = queue<string>();
    for (size_t i = 0; i < vstup.length(); i++){
        string instrukcia = " ";
        instrukcia[0] = vstup[i];
        program.push(instrukcia);
    }
    return *this;
}
 
void VM::spusti(){
    for ( ; !program.empty(); program.pop()){
        string instrukcia = program.front();
        
        instrukcia_t::iterator iterator = instrukcie.find(instrukcia);
 
        if (iterator != instrukcie.end()){
            iterator->second();
        }
        else{
        }
    }
}
 
int main(int argc, char ** argv, char ** env){
    VM virtualny_stroj;
    virtualny_stroj <<
        "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>"
        "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>"
        "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>"
        "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>"
        "<<<<.>.>.>.";
    /*
    A - 65 
    H - 72
    O - 79
    J - 74
 
    CLR
    */
 
    virtualny_stroj.spusti();
 
    return 0;
}

Comments