Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <cstdlib>
- #include <vector>
- #include <string>
- #include <sstream>
- using namespace std;
- char *code_script;
- struct Var{
- string name;
- string var;
- };
- struct Func{
- string name;
- int pos;
- };
- vector<string> token_list;
- vector<Var> var_list;
- vector<string> vm_stack;
- vector<Func> func_list;
- void push_stack(string var)
- {
- vm_stack.insert(vm_stack.end(),var);
- }
- string pop_stack()
- {
- if(vm_stack.size() < 1)
- {
- cout << "Стек пустой,но программа пытается взять значение!" << endl;
- exit(1);
- }
- string out;
- out = vm_stack[vm_stack.size()-1];
- vm_stack.erase(vm_stack.end());
- return out;
- }
- bool break_token(char a,string b)
- {
- for(int i = 0;i != b.length();i++)
- {
- if(a == b[i])
- {
- return true;
- }
- }
- return false;
- }
- bool break_word(string a,string b)
- {
- for(int i = 0;i != a.length();i++)
- {
- for(int x = 0;x != b.length();x++)
- {
- if(a[i] == b[x])
- {
- return true;
- }
- }
- }
- return false;
- }
- int find_var(string name)
- {
- for(int i = 0;i != var_list.size();i++)
- {
- if(var_list[i].name == name)
- {
- return i;
- }
- }
- return -1;
- }
- int find_func(string name)
- {
- for(int i = 0;i != func_list.size();i++)
- {
- if(func_list[i].name == name)
- {
- return func_list[i].pos;
- }
- }
- return -1;
- }
- int string_to_int(string var){
- int out = 0;
- for(int i = 0;i != var.length();i++){
- out = out * 10;
- out = out + var[i] - '0';
- }
- return out;
- }
- void token_create(int length_file)
- {
- string bild_string;
- for(int i = 0;i != length_file;i++)
- {
- if(!break_token(code_script[i]," ,'\t\n"))
- {
- bild_string.push_back(code_script[i]);
- }
- else
- {
- if(!bild_string.empty())
- {
- token_list.insert(token_list.end(),bild_string);
- bild_string.clear();
- }
- if(code_script[i] == '\'')
- {
- for(int x = i+1;x != length_file;x++)
- {
- if(code_script[x] != '\'')
- {
- bild_string.push_back(code_script[x]);
- }
- else
- {
- token_list.insert(token_list.end(),bild_string);
- bild_string.clear();
- i = x;
- x = length_file-1;
- }
- }
- }
- else
- {
- if(code_script[i] != ' ' && code_script[i] != '\t')
- {
- bild_string.push_back(code_script[i]);
- token_list.insert(token_list.end(),bild_string);
- bild_string.clear();
- }
- }
- }
- }
- token_list.insert(token_list.end(),bild_string);
- Func func;
- for(int i = 0;i != token_list.size();i++){
- if(token_list[i] == "func")
- {
- func.name = token_list[i+1];
- func.pos = i+2;
- func_list.insert(func_list.end(),func);
- i++;
- }
- }
- vector<string> line;
- vector<int> funcParent;
- char cmp_result = 0;
- for(int i = 0;i != token_list.size();i++)
- {
- if(token_list[i] != "\n")
- {
- line.insert(line.end(),token_list[i]);
- }
- else
- {
- if(line.size() != 0)
- {
- if(line[0] == "var")
- {
- Var var;
- var.name = line[1];
- if(find_var(var.name) == -1)
- {
- var.var = line[2];
- var_list.insert(var_list.end(),var);
- }
- }
- else
- {
- if(line[0] == "push")
- {
- int varAdr = find_var(line[1]);
- if(varAdr == -1){
- push_stack(line[1]);
- }
- else
- {
- push_stack(var_list[varAdr].var);
- }
- }
- else
- {
- if(line[0] == "pop")
- {
- int varAdr = find_var(line[1]);
- if(varAdr == -1){
- cout << "Попытка поместить данные из стека в несуществующую переменную!" << endl;
- exit(1);
- }
- var_list[varAdr].var = pop_stack();
- }
- else
- {
- if(line[0] == "call")
- {
- if(line[1] == "print")
- {
- cout << pop_stack();
- }
- else
- {
- if(line[1] == "println")
- {
- cout << pop_stack() << endl;
- }
- else
- {
- if(line[1] == "ifstring")
- {
- if(pop_stack() == pop_stack())
- push_stack("1");
- else
- push_stack("0");
- }
- else
- {
- if(line[1] == "getSymbol")
- {
- string str = pop_stack();
- string cur = pop_stack();
- string out;
- out.push_back(string_to_int(cur));
- push_stack(out);
- }
- else
- {
- if(line[1] == "connectString")
- {
- string str = pop_stack();
- str.append(pop_stack());
- push_stack(str);
- }
- else
- {
- if(line[1] == "readFile")
- {
- string patch = pop_stack();
- ifstream rf(&patch[0]);
- rf.seekg(0,rf.end);
- int rf_len = rf.tellg();
- rf.seekg(0,rf.beg);
- string out(' ',rf_len);
- rf.read(&out[0],rf_len);
- rf.close();
- push_stack(out);
- }
- else
- {
- if(line[1] == "writeFile")
- {
- string patch = pop_stack();
- ofstream rf(&patch[0]);
- string wr = pop_stack();
- rf.write(&wr[0],wr.length());
- rf.close();
- }
- else
- {
- if(line[1] == "clear")
- {
- system("clear");
- }
- else
- {
- int funcAdr = find_func(line[1]);
- if(funcAdr == -1)
- {
- cout << "Попытка вызвать несуществующую функцию!" << endl;
- exit(1);
- }
- funcParent.insert(funcParent.end(),i);
- i = funcAdr;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- else
- {
- if(line[0] == "jmp")
- {
- int funcAdr = find_func(line[1]);
- if(funcAdr == -1)
- {
- cout << "Попытка перейти на несуществующую функцию!" << endl;
- exit(1);
- }
- i = funcAdr;
- }
- else
- {
- if(line[0] == "if")
- {
- bool true_if = false;
- int a,b;
- int varAdr = find_var(line[1]);
- int varAdr2 = find_var(line[3]);
- if(varAdr == -1){
- a = string_to_int(line[1]);
- }
- else{
- a = string_to_int(var_list[varAdr].var);
- }
- if(varAdr2 == -1){
- b = string_to_int(line[3]);
- }
- else{
- b = string_to_int(var_list[varAdr2].var);
- }
- if(line[2] == "==")
- {
- if(a == b){
- true_if = true;
- }
- }
- if(line[2] == "!=")
- {
- if(a != b){
- true_if = true;
- }
- }
- if(line[2] == ">=")
- {
- if(a >= b){
- true_if = true;
- }
- }
- if(line[2] == "<=")
- {
- if(a <= b){
- true_if = true;
- }
- }
- if(true_if){
- int funcAdr = find_func(line[4]);
- if(funcAdr == -1)
- {
- cout << "Попытка перейти на несуществующую функцию!" << endl;
- exit(1);
- }
- i = funcAdr;
- }
- }
- else
- {
- if(line[0] == "add")
- {
- int varAdr = find_var(line[1]);
- int varAdr2 = find_var(line[3]);
- int a,b;
- if(varAdr == -1){
- cout << "Попытка сложить несуществующую переменную!" << endl;
- exit(1);
- }
- else{
- a = string_to_int(var_list[varAdr].var);
- }
- if(varAdr2 == -1){
- b = string_to_int(line[3]);
- }
- else{
- b = string_to_int(var_list[varAdr2].var);
- }
- a += b;
- stringstream stream;
- stream << a;
- string out = stream.str();
- var_list[varAdr].var = out;
- }
- else
- {
- if(line[0] == "sub")
- {
- int varAdr = find_var(line[1]);
- int varAdr2 = find_var(line[3]);
- int a,b;
- if(varAdr == -1){
- cout << "Попытка сложить несуществующую переменную!" << endl;
- exit(1);
- }
- else{
- a = string_to_int(var_list[varAdr].var);
- }
- if(varAdr2 == -1){
- b = string_to_int(line[3]);
- }
- else{
- b = string_to_int(var_list[varAdr2].var);
- }
- a -= b;
- stringstream stream;
- stream << a;
- string out = stream.str();
- var_list[varAdr].var = out;
- }
- else
- {
- if(line[0] == "mul")
- {
- int varAdr = find_var(line[1]);
- int varAdr2 = find_var(line[3]);
- int a,b;
- if(varAdr == -1){
- cout << "Попытка сложить несуществующую переменную!" << endl;
- exit(1);
- }
- else{
- a = string_to_int(var_list[varAdr].var);
- }
- if(varAdr2 == -1){
- b = string_to_int(line[3]);
- }
- else{
- b = string_to_int(var_list[varAdr2].var);
- }
- a *= b;
- stringstream stream;
- stream << a;
- string out = stream.str();
- var_list[varAdr].var = out;
- }
- else
- {
- if(line[0] == "div")
- {
- int varAdr = find_var(line[1]);
- int varAdr2 = find_var(line[3]);
- int a,b;
- if(varAdr == -1){
- cout << "Попытка сложить несуществующую переменную!" << endl;
- exit(1);
- }
- else{
- a = string_to_int(var_list[varAdr].var);
- }
- if(varAdr2 == -1){
- b = string_to_int(line[3]);
- }
- else{
- b = string_to_int(var_list[varAdr2].var);
- }
- a /= b;
- stringstream stream;
- stream << a;
- string out = stream.str();
- var_list[varAdr].var = out;
- }
- else
- {
- if(line[0] == "inc")
- {
- int varAdr = find_var(line[1]);
- if(varAdr == -1)
- {
- cout << "Попытка инкремента несуществующей переменной!" << endl;
- exit(1);
- }
- int a = string_to_int(var_list[varAdr].var);
- a++;
- stringstream stream;
- stream << a;
- var_list[varAdr].var = stream.str();
- }
- else
- {
- if(line[0] == "dec")
- {
- int varAdr = find_var(line[1]);
- if(varAdr == -1)
- {
- cout << "Попытка дескремента несуществующей переменной!" << endl;
- exit(1);
- }
- int a = string_to_int(var_list[varAdr].var);
- a++;
- stringstream stream;
- stream << a;
- var_list[varAdr].var = stream.str();
- }
- else
- {
- if(line[0] == "del")
- {
- int varAdr = find_var(line[1]);
- if(varAdr == -1){
- cout << "Попытка удалить несуществующую переменную!" << endl;
- exit(1);
- }
- var_list.erase(var_list.begin()+varAdr);
- }
- else
- {
- if(line[0] == "inp")
- {
- int varAdr = find_var(line[1]);
- if(varAdr == -1){
- cout << "Попытка ввода в несуществующую переменную!" << endl;
- exit(1);
- }
- string out;
- cin >> out;
- var_list[varAdr].var = out;
- }
- else
- {
- if(line[0] == "mov")
- {
- int varAdr = find_var(line[1]);
- if(varAdr == -1)
- {
- cout << "Попытка поместить данные в несуществующую переменную!" << endl;
- exit(1);
- }
- int varAdr2 = find_var(line[3]);
- if(varAdr2 == -1){
- var_list[varAdr].var = line[3];
- }
- else
- {
- var_list[varAdr].var = var_list[varAdr2].var;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- line.clear();
- }
- }
- }
- }
- int main(int argc,char* argv[])
- {
- push_stack("Linux");
- ifstream read_code;
- if(argc < 2)
- {
- read_code.open("code.asm");
- }
- else
- {
- read_code.open(argv[1]);
- }
- if(read_code.fail())
- {
- cout << "Ошибка,невозможно открыть исполняемый файл!" << endl;
- exit(1);
- }
- read_code.seekg(0,read_code.end);
- int length_file = read_code.tellg();
- read_code.seekg(0,read_code.beg);
- code_script = new char[length_file];
- read_code.read(code_script,length_file);
- read_code.close();
- token_create(length_file);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement