Advertisement
fimas

Brainfuck interpreter 2

Aug 19th, 2014
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.59 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. class Memory
  8. {
  9. public:
  10.     Memory()
  11.     {
  12.         memory.reserve(MAX_MEMORY);
  13.         zeroMemory();
  14.         pointer = memory.begin();
  15.     }
  16.  
  17.     void forward()
  18.     {
  19.         ++pointer;
  20.     }
  21.  
  22.     void backward()
  23.     {
  24.         --pointer;
  25.     }
  26.  
  27.     void add()
  28.     {
  29.         ++(*pointer);
  30.     }
  31.  
  32.     void sub()
  33.     {
  34.         --(*pointer);
  35.     }
  36.  
  37.     void putchar()
  38.     {
  39.         cout << *pointer;
  40.     }
  41.  
  42.     void getchar()
  43.     {
  44.         cin >> *pointer;
  45.     }
  46.  
  47.     unsigned char getValue()
  48.     {
  49.         return *pointer;
  50.     }
  51. private:
  52.     const unsigned int MAX_MEMORY = 30000;
  53.     vector<unsigned char> memory;
  54.     vector<unsigned char>::iterator pointer;
  55.  
  56.     void zeroMemory()
  57.     {
  58.         for (size_t i = 0; i < MAX_MEMORY; i++)
  59.         {
  60.             memory.push_back(0);
  61.         }
  62.     }
  63. };
  64.  
  65. class Brainfuck
  66. {
  67. public:
  68.     static const unsigned char addition    = '+';
  69.     static const unsigned char subtraction = '-';
  70.     static const unsigned char forward     = '>';
  71.     static const unsigned char backward    = '<';
  72.     static const unsigned char putchar     = '.';
  73.     static const unsigned char getchar     = ',';
  74.     static const unsigned char loopStart   = '[';
  75.     static const unsigned char loopEnd     = ']';
  76.  
  77.     Brainfuck(string input) : code(input)
  78.     {
  79.         buffer = code.begin();
  80.     }
  81.  
  82.     void run()
  83.     {
  84.         for (; buffer != code.end(); ++buffer)
  85.         {
  86.             switch (*buffer)
  87.             {
  88.             case Brainfuck::addition:
  89.                 mem.add();
  90.                 break;
  91.             case Brainfuck::subtraction:
  92.                 mem.sub();
  93.                 break;
  94.             case Brainfuck::forward:
  95.                 mem.forward();
  96.                 break;
  97.             case Brainfuck::backward:
  98.                 mem.backward();
  99.                 break;
  100.             case Brainfuck::putchar:
  101.                 mem.putchar();
  102.                 break;
  103.             case Brainfuck::getchar:
  104.                 mem.getchar();
  105.                 break;
  106.             case Brainfuck::loopStart:
  107.                 startLoop();
  108.                 break;
  109.             case Brainfuck::loopEnd:
  110.                 endLoop();
  111.                 break;
  112.             default:
  113.                 break;
  114.             }
  115.         }
  116.     }
  117.  
  118. private:
  119.     Memory mem;
  120.     string code;
  121.     string::iterator buffer;
  122.     vector<string::iterator> loopPosition;
  123.  
  124.     void startLoop()
  125.     {
  126.         if (mem.getValue())
  127.         {
  128.             loopPosition.push_back(buffer);
  129.         }
  130.         else
  131.         {
  132.             while (*buffer != Brainfuck::loopEnd)
  133.                 ++buffer;
  134.         }
  135.     }
  136.  
  137.     void endLoop()
  138.     {
  139.         if (mem.getValue())
  140.         {
  141.             buffer = loopPosition.back();
  142.         }
  143.         else
  144.         {
  145.             loopPosition.pop_back();
  146.         }
  147.     }
  148. };
  149.  
  150. int main(int argc, char* argv[])
  151. {
  152.     string inData;
  153.     if (argc == 2)
  154.     {
  155.         wstring codeFile = argv[1];
  156.         ifstream file(codeFile, ios::in);
  157.         char buff;
  158.  
  159.         file >> skipws;
  160.  
  161.         while (file >> buff)
  162.             inData += buff;
  163.        
  164.         file.close();
  165.     }
  166.     else
  167.     {
  168.         inData = "++++[>++++[>++++<-]<-]>>.";
  169.     }
  170.  
  171.     Brainfuck bf(inData);
  172.     bf.run();
  173.  
  174.     return 0;
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement