Advertisement
fimas

Brainfuck interpreter

Aug 19th, 2014
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.31 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. int main(int argc, char* argv[])
  8. {
  9.     string inData;
  10.     if (argc == 2)
  11.     {
  12.         string codeFile = argv[1];
  13.         ifstream file(codeFile, ios::in);
  14.         char buff;
  15.  
  16.         while (file >> buff)
  17.             inData += buff;
  18.        
  19.         file.close();
  20.     }
  21.     else
  22.     {
  23.         inData = "++++[>++++[>++++<-]<-]>>.";
  24.     }
  25.  
  26.     vector<unsigned char> memory;
  27.     size_t memory_limit = 30000;
  28.     memory.reserve(memory_limit);
  29.  
  30.     for (int i = 0; i < memory_limit; i++)
  31.         memory.push_back(0);
  32.  
  33.     vector<unsigned char>::iterator pointer = memory.begin();
  34.     vector<string::iterator> loopPosition;
  35.  
  36.     for (string::iterator buffer = inData.begin(); buffer != inData.end(); ++buffer)
  37.     {
  38.         switch (*buffer)
  39.         {
  40.         case '>':
  41.             ++pointer;
  42.             break;
  43.         case '<':
  44.             --pointer;
  45.             break;
  46.         case '+':
  47.             ++(*pointer);
  48.             break;
  49.         case '-':
  50.             --(*pointer);
  51.             break;
  52.         case '[':
  53.             if (*pointer)
  54.             {
  55.                 loopPosition.push_back(buffer);
  56.             }
  57.             else
  58.             {
  59.                 while (*buffer != ']')
  60.                     ++buffer;
  61.             }
  62.             break;
  63.         case ']':
  64.             if (*pointer)
  65.             {
  66.                 buffer = loopPosition.back();
  67.             }
  68.             else
  69.             {
  70.                 loopPosition.pop_back();
  71.             }
  72.             break;
  73.         case '.':
  74.             cout << *pointer;
  75.             break;
  76.         case ',':
  77.             cin >> *pointer;
  78.             break;
  79.         default:
  80.             break;
  81.         }
  82.     }
  83.  
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement