brainfuck-Compiler TMP style
-
fdfdg schrieb:
Hm
Mit TMP kann man Iteration aber auch nur mit "Rekursion" (also tiefer intantiieren) umsetzen, oder? Oder könnte man evtl die Befehle in eine Typliste transformieren und die iterativ abarbeiten?
Ne, die Tiefe der Typliste wäre ja auch linear zur Eingabe.
-
TMP ist wie eine funktionale Sprache, Iterationen muss man als Rekursion umschreiben.
@camper: Das ist mal was interessantes und herrlich sinnloses
. Aber ich mag gerade keinen neuen Compiler installieren, um mögliche Verbesserungen testen zu können. Mein jetziger g++ ist nur 4.4.5.
-
auf ubuntu sudo apt-get install gcc-snapshot und er packt den 4.7er in ein seperates verzeichnis, alles bleibt wies ist
-
Könntest du erklären, wie du den String in ein template bekommen hast?
-
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.)
-
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?