Advertisement
Guest User

Untitled

a guest
Dec 3rd, 2017
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 41.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstdlib>
  4. #include <vector>
  5. #include <string>
  6. #include <sstream>
  7.  
  8. using namespace std;
  9.  
  10. char *code_script;
  11.  
  12. struct Var{
  13.     string name;
  14.     string var;
  15. };
  16.  
  17. struct Func{
  18.     string name;
  19.     int pos;
  20. };
  21.  
  22. vector<string> token_list;
  23.  
  24. vector<Var> var_list;
  25.  
  26. vector<string> vm_stack;
  27.  
  28. vector<Func>  func_list;
  29.  
  30. void push_stack(string var)
  31. {
  32.     vm_stack.insert(vm_stack.end(),var);
  33. }
  34.  
  35. string pop_stack()
  36. {
  37.     if(vm_stack.size() < 1)
  38.     {
  39.         cout << "Стек пустой,но программа пытается взять значение!" << endl;
  40.         exit(1);
  41.     }
  42.  
  43.     string out;
  44.     out = vm_stack[vm_stack.size()-1];
  45.     vm_stack.erase(vm_stack.end());
  46.     return out;
  47. }
  48.  
  49.  
  50. bool break_token(char a,string b)
  51. {
  52.     for(int i = 0;i != b.length();i++)
  53.     {
  54.         if(a == b[i])
  55.         {
  56.             return true;
  57.         }
  58.     }
  59.     return false;
  60. }
  61.  
  62. bool break_word(string a,string b)
  63. {
  64.     for(int i = 0;i != a.length();i++)
  65.     {
  66.         for(int x = 0;x != b.length();x++)
  67.         {
  68.             if(a[i] == b[x])
  69.             {
  70.                 return true;
  71.             }
  72.         }
  73.     }
  74.     return false;
  75. }
  76.  
  77. int find_var(string name)
  78. {
  79.     for(int i = 0;i != var_list.size();i++)
  80.     {
  81.         if(var_list[i].name == name)
  82.         {
  83.             return i;
  84.         }
  85.     }
  86.  
  87.     return -1;
  88. }
  89.  
  90. int find_func(string name)
  91. {
  92.     for(int i = 0;i != func_list.size();i++)
  93.     {
  94.         if(func_list[i].name == name)
  95.         {
  96.             return func_list[i].pos;
  97.         }
  98.     }
  99.  
  100.     return -1;
  101. }
  102.  
  103. int string_to_int(string var){
  104.         int out = 0;
  105.         for(int i = 0;i != var.length();i++){
  106.             out = out * 10;
  107.             out = out + var[i] - '0';
  108.         }
  109.         return out;
  110. }
  111.  
  112.  
  113. void token_create(int length_file)
  114. {
  115.  
  116.     string bild_string;
  117.  
  118.     for(int i = 0;i != length_file;i++)
  119.     {
  120.         if(!break_token(code_script[i]," ,'\t\n"))
  121.         {
  122.             bild_string.push_back(code_script[i]);
  123.         }
  124.             else
  125.             {
  126.                 if(!bild_string.empty())
  127.                 {
  128.                     token_list.insert(token_list.end(),bild_string);
  129.                     bild_string.clear();
  130.                 }
  131.  
  132.                 if(code_script[i] == '\'')
  133.                 {
  134.                     for(int x = i+1;x != length_file;x++)
  135.                     {
  136.                         if(code_script[x] != '\'')
  137.                         {
  138.                             bild_string.push_back(code_script[x]);
  139.                         }
  140.                             else
  141.                             {
  142.                                 token_list.insert(token_list.end(),bild_string);
  143.  
  144.                                 bild_string.clear();
  145.  
  146.                                 i = x;
  147.  
  148.                                 x = length_file-1;
  149.                             }
  150.                     }
  151.  
  152.                 }
  153.                     else
  154.                     {
  155.  
  156.                         if(code_script[i] != ' ' && code_script[i] != '\t')
  157.                         {
  158.  
  159.                             bild_string.push_back(code_script[i]);
  160.  
  161.                             token_list.insert(token_list.end(),bild_string);
  162.  
  163.                             bild_string.clear();
  164.                         }
  165.                     }
  166.             }
  167.     }
  168.  
  169.     token_list.insert(token_list.end(),bild_string);
  170.  
  171.  
  172.     Func func;
  173.     for(int i = 0;i != token_list.size();i++){
  174.         if(token_list[i] == "func")
  175.         {
  176.             func.name = token_list[i+1];
  177.             func.pos = i+2;
  178.             func_list.insert(func_list.end(),func);
  179.             i++;
  180.         }
  181.     }
  182.  
  183.  
  184.     vector<string> line;
  185.     vector<int> funcParent;
  186.     char cmp_result = 0;
  187.  
  188.     for(int i = 0;i != token_list.size();i++)
  189.     {
  190.  
  191.         if(token_list[i] != "\n")
  192.         {
  193.             line.insert(line.end(),token_list[i]);
  194.         }
  195.             else
  196.             {
  197.                 if(line.size() != 0)
  198.                 {
  199.                     if(line[0] == "var")
  200.                     {
  201.                         Var var;
  202.                         var.name = line[1];
  203.                         if(find_var(var.name) == -1)
  204.                         {
  205.                             var.var = line[2];
  206.                             var_list.insert(var_list.end(),var);
  207.                         }
  208.                     }
  209.                         else
  210.                         {
  211.                             if(line[0] == "push")
  212.                             {
  213.                                 int varAdr = find_var(line[1]);
  214.                                 if(varAdr == -1){
  215.                                     push_stack(line[1]);
  216.                                 }
  217.                                     else
  218.                                     {
  219.                                         push_stack(var_list[varAdr].var);
  220.                                     }
  221.                             }
  222.                                 else
  223.                                 {
  224.                                     if(line[0] == "pop")
  225.                                     {
  226.                                         int varAdr = find_var(line[1]);
  227.                                         if(varAdr == -1){
  228.                                             cout << "Попытка поместить данные из стека в несуществующую переменную!" << endl;
  229.                                             exit(1);
  230.                                         }
  231.                                         var_list[varAdr].var = pop_stack();
  232.                                     }
  233.                                         else
  234.                                         {
  235.                                             if(line[0] == "call")
  236.                                             {
  237.                                                 if(line[1] == "print")
  238.                                                 {
  239.                                                     cout << pop_stack();
  240.                                                 }
  241.                                                     else
  242.                                                     {
  243.                                                         if(line[1] == "println")
  244.                                                         {
  245.                                                             cout << pop_stack() << endl;
  246.                                                         }
  247.                                                             else
  248.                                                             {
  249.                                                                 if(line[1] == "ifstring")
  250.                                                                 {
  251.                                                                     if(pop_stack() == pop_stack())
  252.                                                                         push_stack("1");
  253.                                                                     else
  254.                                                                         push_stack("0");
  255.                                                                 }
  256.                                                                     else
  257.                                                                     {
  258.                                                                         if(line[1] == "getSymbol")
  259.                                                                         {
  260.                                                                             string str = pop_stack();
  261.                                                                             string cur = pop_stack();
  262.                                                                             string out;
  263.                                                                             out.push_back(string_to_int(cur));
  264.                                                                             push_stack(out);
  265.                                                                         }
  266.                                                                             else
  267.                                                                             {
  268.                                                                                 if(line[1] == "connectString")
  269.                                                                                 {
  270.                                                                                     string str = pop_stack();
  271.                                                                                     str.append(pop_stack());
  272.                                                                                     push_stack(str);
  273.                                                                                 }
  274.                                                                                     else
  275.                                                                                     {
  276.                                                                                         if(line[1] == "readFile")
  277.                                                                                         {
  278.                                                                                             string patch = pop_stack();
  279.                                                                                             ifstream rf(&patch[0]);
  280.  
  281.                                                                                             rf.seekg(0,rf.end);
  282.  
  283.                                                                                             int rf_len = rf.tellg();
  284.  
  285.                                                                                             rf.seekg(0,rf.beg);
  286.  
  287.                                                                                             string out(' ',rf_len);
  288.                                                                                             rf.read(&out[0],rf_len);
  289.                                                                                             rf.close();
  290.  
  291.                                                                                             push_stack(out);
  292.  
  293.                                                                                         }
  294.                                                                                             else
  295.                                                                                             {
  296.                                                                                                 if(line[1] == "writeFile")
  297.                                                                                                 {
  298.                                                                                                     string patch = pop_stack();
  299.                                                                                                     ofstream rf(&patch[0]);
  300.                                                                                                     string wr = pop_stack();
  301.                                                                                                     rf.write(&wr[0],wr.length());
  302.                                                                                                     rf.close();
  303.                                                                                                 }
  304.                                                                                                     else
  305.                                                                                                     {
  306.                                                                                                        if(line[1] == "clear")
  307.                                                                                                        {
  308.                                                                                                            system("clear");
  309.                                                                                                        }
  310.                                                                                                             else
  311.                                                                                                             {
  312.                                                                                                                 int funcAdr = find_func(line[1]);
  313.                                                                                                                 if(funcAdr == -1)
  314.                                                                                                                 {
  315.                                                                                                                     cout << "Попытка вызвать несуществующую функцию!" << endl;
  316.                                                                                                                     exit(1);
  317.                                                                                                                 }
  318.                                                                                                                 funcParent.insert(funcParent.end(),i);
  319.                                                                                                                 i = funcAdr;
  320.                                                                                                             }
  321.                                                                                                     }
  322.  
  323.                                                                                             }
  324.                                                                                     }
  325.                                                                             }
  326.                                                                     }
  327.  
  328.                                                             }
  329.                                                     }
  330.                                             }
  331.                                                 else
  332.                                                 {
  333.                                                     if(line[0] == "jmp")
  334.                                                     {
  335.                                                         int funcAdr = find_func(line[1]);
  336.                                                         if(funcAdr == -1)
  337.                                                         {
  338.                                                                     cout << "Попытка перейти на несуществующую функцию!" << endl;
  339.                                                                     exit(1);
  340.                                                         }
  341.  
  342.                                                         i = funcAdr;
  343.                                                     }
  344.                                                         else
  345.                                                         {
  346.                                                             if(line[0] == "if")
  347.                                                             {
  348.                                                                 bool true_if = false;
  349.  
  350.                                                                 int a,b;
  351.  
  352.                                                                 int varAdr = find_var(line[1]);
  353.                                                                 int varAdr2 = find_var(line[3]);
  354.  
  355.                                                                 if(varAdr == -1){
  356.                                                                     a = string_to_int(line[1]);
  357.                                                                 }
  358.                                                                 else{
  359.                                                                     a = string_to_int(var_list[varAdr].var);
  360.                                                                 }
  361.  
  362.                                                                 if(varAdr2 == -1){
  363.                                                                     b = string_to_int(line[3]);
  364.                                                                 }
  365.                                                                 else{
  366.                                                                     b = string_to_int(var_list[varAdr2].var);
  367.                                                                 }
  368.  
  369.  
  370.  
  371.  
  372.  
  373.  
  374.                                                                 if(line[2] == "==")
  375.                                                                 {
  376.                                                                     if(a == b){
  377.                                                                         true_if = true;
  378.                                                                     }
  379.                                                                 }
  380.                                                                 if(line[2] == "!=")
  381.                                                                 {
  382.                                                                     if(a != b){
  383.                                                                         true_if = true;
  384.                                                                     }
  385.                                                                 }
  386.                                                                 if(line[2] == ">=")
  387.                                                                 {
  388.                                                                     if(a >= b){
  389.                                                                         true_if = true;
  390.                                                                     }
  391.                                                                 }
  392.                                                                 if(line[2] == "<=")
  393.                                                                 {
  394.                                                                     if(a <= b){
  395.                                                                         true_if = true;
  396.                                                                     }
  397.                                                                 }
  398.  
  399.                                                                 if(true_if){
  400.                                                                     int funcAdr = find_func(line[4]);
  401.                                                                     if(funcAdr == -1)
  402.                                                                     {
  403.                                                                         cout << "Попытка перейти на несуществующую функцию!" << endl;
  404.                                                                         exit(1);
  405.                                                                     }
  406.  
  407.                                                                     i = funcAdr;
  408.                                                                 }
  409.                                                             }
  410.                                                                 else
  411.                                                                 {
  412.                                                                     if(line[0] == "add")
  413.                                                                     {
  414.                                                                         int varAdr = find_var(line[1]);
  415.                                                                         int varAdr2 = find_var(line[3]);
  416.                                                                         int a,b;
  417.  
  418.                                                                         if(varAdr == -1){
  419.                                                                             cout << "Попытка сложить несуществующую переменную!" << endl;
  420.                                                                             exit(1);
  421.                                                                         }
  422.                                                                             else{
  423.                                                                                 a = string_to_int(var_list[varAdr].var);
  424.                                                                             }
  425.  
  426.                                                                         if(varAdr2 == -1){
  427.                                                                             b = string_to_int(line[3]);
  428.                                                                         }
  429.                                                                             else{
  430.                                                                                 b = string_to_int(var_list[varAdr2].var);
  431.                                                                             }
  432.  
  433.                                                                         a += b;
  434.                                                                         stringstream stream;
  435.                                                                         stream << a;
  436.                                                                         string out = stream.str();
  437.  
  438.                                                                         var_list[varAdr].var = out;
  439.  
  440.                                                                     }
  441.                                                                         else
  442.                                                                         {
  443.                                                                             if(line[0] == "sub")
  444.                                                                             {
  445.                                                                                 int varAdr = find_var(line[1]);
  446.                                                                                 int varAdr2 = find_var(line[3]);
  447.                                                                                 int a,b;
  448.  
  449.                                                                                 if(varAdr == -1){
  450.                                                                                     cout << "Попытка сложить несуществующую переменную!" << endl;
  451.                                                                                     exit(1);
  452.                                                                                 }
  453.                                                                                 else{
  454.                                                                                     a = string_to_int(var_list[varAdr].var);
  455.                                                                                 }
  456.  
  457.                                                                                 if(varAdr2 == -1){
  458.                                                                                     b = string_to_int(line[3]);
  459.                                                                                 }
  460.                                                                                 else{
  461.                                                                                     b = string_to_int(var_list[varAdr2].var);
  462.                                                                                 }
  463.  
  464.                                                                                 a -= b;
  465.                                                                                 stringstream stream;
  466.                                                                                 stream << a;
  467.                                                                                 string out = stream.str();
  468.  
  469.                                                                                 var_list[varAdr].var = out;
  470.                                                                             }
  471.                                                                                 else
  472.                                                                                 {
  473.                                                                                     if(line[0] == "mul")
  474.                                                                                     {
  475.                                                                                         int varAdr = find_var(line[1]);
  476.                                                                                         int varAdr2 = find_var(line[3]);
  477.                                                                                         int a,b;
  478.  
  479.                                                                                         if(varAdr == -1){
  480.                                                                                             cout << "Попытка сложить несуществующую переменную!" << endl;
  481.                                                                                             exit(1);
  482.                                                                                         }
  483.                                                                                         else{
  484.                                                                                             a = string_to_int(var_list[varAdr].var);
  485.                                                                                         }
  486.  
  487.                                                                                         if(varAdr2 == -1){
  488.                                                                                             b = string_to_int(line[3]);
  489.                                                                                         }
  490.                                                                                         else{
  491.                                                                                             b = string_to_int(var_list[varAdr2].var);
  492.                                                                                         }
  493.  
  494.                                                                                         a *= b;
  495.                                                                                         stringstream stream;
  496.                                                                                         stream << a;
  497.                                                                                         string out = stream.str();
  498.  
  499.                                                                                         var_list[varAdr].var = out;
  500.                                                                                     }
  501.                                                                                         else
  502.                                                                                         {
  503.                                                                                             if(line[0] == "div")
  504.                                                                                             {
  505.                                                                                                 int varAdr = find_var(line[1]);
  506.                                                                                                 int varAdr2 = find_var(line[3]);
  507.                                                                                                 int a,b;
  508.  
  509.                                                                                                 if(varAdr == -1){
  510.                                                                                                     cout << "Попытка сложить несуществующую переменную!" << endl;
  511.                                                                                                     exit(1);
  512.                                                                                                 }
  513.                                                                                                 else{
  514.                                                                                                     a = string_to_int(var_list[varAdr].var);
  515.                                                                                                 }
  516.  
  517.                                                                                                 if(varAdr2 == -1){
  518.                                                                                                     b = string_to_int(line[3]);
  519.                                                                                                 }
  520.                                                                                                 else{
  521.                                                                                                     b = string_to_int(var_list[varAdr2].var);
  522.                                                                                                 }
  523.  
  524.                                                                                                 a /= b;
  525.                                                                                                 stringstream stream;
  526.                                                                                                 stream << a;
  527.                                                                                                 string out = stream.str();
  528.  
  529.                                                                                                 var_list[varAdr].var = out;
  530.                                                                                             }
  531.                                                                                                 else
  532.                                                                                                 {
  533.                                                                                                     if(line[0] == "inc")
  534.                                                                                                     {
  535.                                                                                                         int varAdr = find_var(line[1]);
  536.                                                                                                         if(varAdr == -1)
  537.                                                                                                         {
  538.                                                                                                             cout << "Попытка инкремента несуществующей переменной!" << endl;
  539.                                                                                                             exit(1);
  540.                                                                                                         }
  541.                                                                                                         int a = string_to_int(var_list[varAdr].var);
  542.                                                                                                         a++;
  543.                                                                                                         stringstream stream;
  544.                                                                                                         stream << a;
  545.                                                                                                         var_list[varAdr].var = stream.str();
  546.                                                                                                     }
  547.                                                                                                         else
  548.                                                                                                         {
  549.                                                                                                             if(line[0] == "dec")
  550.                                                                                                             {
  551.                                                                                                                 int varAdr = find_var(line[1]);
  552.                                                                                                                 if(varAdr == -1)
  553.                                                                                                                 {
  554.                                                                                                                     cout << "Попытка дескремента несуществующей переменной!" << endl;
  555.                                                                                                                     exit(1);
  556.                                                                                                                 }
  557.                                                                                                                 int a = string_to_int(var_list[varAdr].var);
  558.                                                                                                                 a++;
  559.                                                                                                                 stringstream stream;
  560.                                                                                                                 stream << a;
  561.                                                                                                                 var_list[varAdr].var = stream.str();
  562.                                                                                                             }
  563.                                                                                                                 else
  564.                                                                                                                 {
  565.                                                                                                                     if(line[0] == "del")
  566.                                                                                                                     {
  567.                                                                                                                         int varAdr = find_var(line[1]);
  568.                                                                                                                         if(varAdr == -1){
  569.                                                                                                                             cout << "Попытка удалить несуществующую переменную!" << endl;
  570.                                                                                                                             exit(1);
  571.                                                                                                                         }
  572.                                                                                                                         var_list.erase(var_list.begin()+varAdr);
  573.                                                                                                                     }
  574.                                                                                                                         else
  575.                                                                                                                         {
  576.                                                                                                                             if(line[0] == "inp")
  577.                                                                                                                             {
  578.                                                                                                                                 int varAdr = find_var(line[1]);
  579.                                                                                                                                 if(varAdr == -1){
  580.                                                                                                                                     cout << "Попытка ввода в несуществующую переменную!" << endl;
  581.                                                                                                                                     exit(1);
  582.                                                                                                                                 }
  583.                                                                                                                                 string out;
  584.                                                                                                                                 cin >> out;
  585.                                                                                                                                 var_list[varAdr].var = out;
  586.                                                                                                                             }
  587.                                                                                                                                 else
  588.                                                                                                                                 {
  589.                                                                                                                                     if(line[0] == "mov")
  590.                                                                                                                                     {
  591.  
  592.                                                                                                                                         int varAdr = find_var(line[1]);
  593.                                                                                                                                         if(varAdr == -1)
  594.                                                                                                                                         {
  595.                                                                                                                                             cout << "Попытка поместить данные в несуществующую переменную!" << endl;
  596.                                                                                                                                             exit(1);
  597.                                                                                                                                         }
  598.  
  599.                                                                                                                                         int varAdr2 = find_var(line[3]);
  600.                                                                                                                                         if(varAdr2 == -1){
  601.                                                                                                                                             var_list[varAdr].var = line[3];
  602.                                                                                                                                         }
  603.                                                                                                                                         else
  604.                                                                                                                                         {
  605.                                                                                                                                             var_list[varAdr].var = var_list[varAdr2].var;
  606.                                                                                                                                         }
  607.  
  608.                                                                                                                                     }
  609.                                                                                                                                 }
  610.                                                                                                                         }
  611.                                                                                                                 }
  612.                                                                                                         }
  613.                                                                                                 }
  614.                                                                                         }
  615.                                                                                 }
  616.                                                                         }
  617.                                                                 }
  618.                                                         }
  619.                                                 }
  620.                                         }
  621.                                 }
  622.                         }
  623.                     line.clear();
  624.                 }
  625.  
  626.             }
  627.  
  628.     }
  629.  
  630.  
  631. }
  632.  
  633.  
  634.  
  635.  
  636. int main(int argc,char* argv[])
  637. {
  638.     push_stack("Linux");
  639.     ifstream read_code;
  640.  
  641.     if(argc < 2)
  642.     {
  643.         read_code.open("code.asm");
  644.     }
  645.         else
  646.         {
  647.             read_code.open(argv[1]);
  648.         }
  649.  
  650.     if(read_code.fail())
  651.     {
  652.         cout << "Ошибка,невозможно открыть исполняемый файл!" << endl;
  653.         exit(1);
  654.     }
  655.  
  656.  
  657.     read_code.seekg(0,read_code.end);
  658.  
  659.     int length_file = read_code.tellg();
  660.  
  661.     read_code.seekg(0,read_code.beg);
  662.  
  663.  
  664.     code_script = new char[length_file];
  665.  
  666.     read_code.read(code_script,length_file);
  667.  
  668.     read_code.close();
  669.  
  670.  
  671.  
  672.     token_create(length_file);
  673.  
  674.     return 0;
  675.  
  676. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement