Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: BrainFuck tulkki

Grandi [12.09.2008 13:36:48]

#

Taas yksi BrainFuck tulkki. Tiedän, että täältä löytyy jo muutama, ja ne ovat moninverroin parempia. Oma koodini on täyttä purkkaa, aiheuttaa vaikka mitä muistivuotoja jne eikä sisällä virheiden käsittelyä. Ottakaa silti huomioon, että olen vasta 14v ja tämä on ensimmäinen C++ projekti :)

#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <fstream>
#include <string>

using namespace std;

// Class for variables
class RVariable
{
public:
  // Prototypes
  int GetFunctionPoint();
  int GetValue();
  int Increase();
  int Decrease();
  int Init();
  int SetValue(int);
private:
  int functionp;
  char value;
};

int RVariable::GetFunctionPoint()
{
  return functionp;
}
int RVariable::GetValue()
{
  return value;
}
int RVariable::Increase()
{
  value++;
}
int RVariable::Decrease()
{
  value--;
}
int RVariable::Init()
{
  value=0;
  functionp=0;
}
int RVariable::SetValue(int val)
{
  value=val;
}

// Prototypes
string LoadCode(string);
void Compile(string);

/*
  TEH MAIN()
*/
int main(int argc, char *argv[])
{
  Compile("code.txt");
}

// Function which loads the code
string LoadCode(string obj)
{
  string code;
  string rcode;
  ifstream myfile(obj.c_str());
  if(myfile.is_open())
  {
    string some;
    while(!myfile.eof())
    {
      getline(myfile,some);
      code = some;
      for(int i=0;i<code.length();i++)
      {
        // Add only compileable letters
        if(code.substr(i,1)=="<" || code.substr(i,1)==">" ||
        code.substr(i,1)=="+" || code.substr(i,1)=="-" ||
        code.substr(i,1)=="[" || code.substr(i,1)=="]" ||
        code.substr(i,1)=="." || code.substr(i,1)==",")
        {
          rcode += code.substr(i,1);
        }
      }
    }
    myfile.close();
  }
  return rcode;
}

// Function which compiles
void Compile(string obj)
{
  // Variables
  int memory = 10000;
  RVariable Variable[memory];
  for(int i=0;i<memory;i++) Variable[i].Init();

  // "Pointers"
  int varpointer=0;
  int codepointer=0;

  // Loop
  int loopstart[255];
  for(int i=0;i<255;i++) loopstart[i]=0;
  int loopavoids=0;
  int loopgoing=0;

  // Read code
  int slen = LoadCode(obj.c_str()).length();
  const char *now = LoadCode(obj.c_str()).c_str();

  bool tf=false;
  while(tf==false)
  {
    if(codepointer>slen+2) tf=true;
    if(loopavoids==0)
    {
      // Next Cell
      if(now[codepointer]==62)
      {
        varpointer++;
        if(varpointer>memory) break;
      // Prev Cell
      }else if(now[codepointer]==60)
      {
        varpointer--;
        if(varpointer<0)varpointer=0;
      // Halt
      }else if(now[codepointer]==44)
      {
        Variable[varpointer].SetValue(_getch());
      // Loop Start Block
      }else if(now[codepointer]==91)
      {
        loopgoing++;
        loopstart[loopgoing]=codepointer;
        if(Variable[varpointer].GetValue()==0)
        {
          loopavoids++;
        }
      // Loop End Block
      }else if(now[codepointer]==93)
      {
        if(Variable[varpointer].GetValue()!=0)
        {
          codepointer = loopstart[loopgoing];
          loopgoing++;
        }
        loopgoing--;
      // Increase
      }else if(now[codepointer]==43)
      {
        Variable[varpointer].Increase();
      // Decrease
      }else if(now[codepointer]==45)
      {
        Variable[varpointer].Decrease();
      // Print
      }else if(now[codepointer]==46)
      {
        cout << char(Variable[varpointer].GetValue());
      }
    }else if(now[codepointer]==91)
    {
      loopgoing++;
      loopavoids++;
    }else if(now[codepointer]==93)
    {
      loopgoing--;
      loopavoids--;
    }
    if(loopavoids<1) loopavoids=0;
    codepointer++;
  }
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta