brainfuck-Compiler TMP style


  • Mod

    GorbGorb schrieb:

    Könntest du erklären, wie du den String in ein template bekommen hast?

    Das ist das Geheimnis der constexpr (und warum man den GNU-Compiler 4.6 braucht). Damit wird der String zur Compilezeit auswertbar.



  • Saubere Arbeit 👍

    Leider kenne ich mich mit boost::mpl überhaupt nicht aus, und kann dir daher schwer helfen. (Muss ich mir endlich mal ansehen.)


  • Mod

    Ich habe eine Idee wie man das Ganze 1000mal effektiver machen kann (kein Scherz, damit wären dann auch kompliziertere Sachen machbar). Dummerweise unterstützt g++ noch keine constexpr Literale als statische Member, deshalb muss die Implementation noch ein bisschen warten.



  • *push*

    Na, wie siehts aus? :p



  • Ich hab versucht, einen Interpreter zu schreiben... bin fast fertig (bin bei der Schleife 😃 ).



  • So, meine erste Version ist jetzt fertig. Bitte Verbesserungsvorschläge!
    Das Hello-World Programm von Wikipedia wird problemlos interpretiert 😃

    /**
          Brainfuck interpreter with Turing-completeness.
          @date: 16/05/2012
    
    */
    
    #include <iostream>
    #include <string>
    #include <deque>
    #include <stdexcept>
    #include <fstream>
    #include <cstdlib>
    #include <sstream>
    #include <unordered_multiset>
    
    typedef std::deque<char> list_type;
    
    list_type array(1);
    
    list_type::iterator iterator(array.begin());
    
    void processString(std::string const& code, std::ostream& output, std::istream& input)
    {
          for(auto strIter(code.begin());strIter != code.end();++strIter)
                switch(*strIter)
                {
                      case '.':
                            output.put(*iterator);
                            break;
    
                      case ',':
                            input.get(*iterator);
                            break;
    
                      case '>':
                      {
                            if(iterator + 1 == array.end())
                                  array.push_back(0);
                            ++iterator;
                      }
                            break;
    
                      case '<':
                      {
                            if(iterator == array.begin())
                                  array.push_front(0);
                            --iterator;
                      }
                            break;
    
                      case '+':
    
                            ++*iterator;
                            break;
    
                      case '-':
                            --*iterator;
                            break;
    
                      case '[':
                      {
    
                            auto braceClosePos = strIter + 1;
                            for(size_t counter(0);;++braceClosePos)
                            {
                                  if(*braceClosePos == '[')
                                        ++counter;
                                  if(*braceClosePos == ']')
                                  {
                                        if(counter)
                                              --counter;
                                        else break;
                                  }
                            }
    
                            std::string str(strIter + 1, braceClosePos);
    
                            while(*iterator)
                                  processString(str, output, input);
    
                            strIter = braceClosePos;
                      }
                }
    }
    
    int main(int argn, char const** params) try
    {
          #ifdef N_DEBUG
                if(argn < 2)
                      throw std::invalid_argument("No file to interpret. STOP.");
    
                std::ifstream stream(params[1]);
          #else
                std::ifstream stream("test.bff");
          #endif
    
          if(!stream)
                throw std::runtime_error("Stream operation failure. Check, wether file isn't corrupted.");
    
          std::ostringstream rdbufstream;
          rdbufstream << stream.rdbuf();
    
          {
                std::unordered_multiset<char> characterset(rdbufstream.str().begin(), rdbufstream.str().end());
                if(characterset.count('[') != characterset.count(']'))
                      throw std::logic_error("The amounts of opening and closing braces don't match!");
          }
    
          processString(rdbufstream.str(), std::cout, std::cin);
    }
    catch(std::exception& e)
    {
          std::cerr << "\nERROR: " << e.what() << '\n';
    }
    catch(...)
    {
          std::cerr << "\nAn unknown error occured.\n";
    }
    

    EDit: Jetzt oben was verbessert... 😃

    EDit²: Schleifen-logik Fehler verbessert (danke Ethon)



  • Deine Logik bei Klammern stinkt.

    [.........] ... ]
    

    Rate mal was da passiert. 😉



  • Ethon schrieb:

    Deine Logik bei Klammern stinkt.

    [.........] ... ]
    

    Rate mal was da passiert. 😉

    Ich weiß, die letzte wird ignoriert 😃
    Aber das lässt sich einfach korigieren (man müsste nur die Anzahl öffnender und schließender Klammern vergleichen) und ist jetzt nicht wichtig.

    Das ROT13-Programm von Wikipedia funktioniert nicht 😞

    Edit: AHHHH, shit:

    [..][..]
    

    funktioniert natürlich nicht 😃



  • Kann man die Threads bitte trennen? Ich finde, die haben so ziemlich gar nichts miteinander zu tun.



  • So, editiert ^^
    Jetzt dürfte jedes (syntaktisch korrekte) Programm funktionieren (und auch Ethons Problematik ist geklärt).



  • Brainfuck-Interpreter gibts auch hier: http://www.c-plusplus.net/forum/292057

    314159265358979 schrieb:

    Kann man die Threads bitte trennen?

    Ja, bitte.



  • Bashar schrieb:

    Brainfuck-Interpreter gibts auch hier: http://www.c-plusplus.net/forum/292057

    Gibts da denn einen in C++? Ist doch C# 😉



  • Und schon hab ich ein Ziel für Heute Nacht: Ein TMP-BF-Interpreter, also ein Interpreter im Compiler. 😋



  • 314159265358979 schrieb:

    Und schon hab ich ein Ziel für Heute Nacht: Ein TMP-BF-Interpreter, also ein Interpreter im Compiler. 😋

    Hä? Kannstes nochmal erklären? 🙂



  • Anstatt wie bei camper, das BF-Programm zur Laufzeit auszuführen, wird das Programm bei mir bereits zur Compilezeit ausgeführt.



  • Wie willste in-/output zur Compilezeit machen?



  • template <unsigned char...>
    struct memory
    {};
    

    :p



  • Also nur 'pseudo'.
    Trotzdem interessant, mach mal. 😉



  • Ethon schrieb:

    Also nur 'pseudo'.
    Trotzdem interessant, mach mal. 😉

    Was gibts eig. noch interessantes in der Richtung? Hab da grad voll Bock drauf 😃



  • Hacker schrieb:

    [...] Hab da grad voll Bock drauf 😃

    Lustmolch! 🤡


Anmelden zum Antworten