![]() |
noch'n BF Interpreter
Liste der Anhänge anzeigen (Anzahl: 2)
Dann will ich auch mal. :lol:
Es tut mir wirklich Leid, Daniel, aber dieses Wort kannte Google auch noch nicht, von uns. :roll: Ja, was soll ich noch dazu sagen? Ihr wisst ja bestimmt schon, worum es geht. *auf FAlter und Co. Schiel* :mrgreen: ![]() ![]() - inkl. einiger/vieler Beispielcodes - BF8.bf erzeugt in der Standardausgabe eine .COM-Datei, welche einen DOS-BF-Interpreter darstellt - "Keymaker's brainfuck interpreter.bf" ist ein BF-Interpreter in BF geschrieben als Input einfach irgendein anderes BF-Script angeben - MiniBF ist ein kleiner/einfacher Konsolen-Interpreter (recht lahmarschig) - MiniBF2 ist 'ne leicht optimierte Variante davon (beide von mir :oops: ) Infos zum "großen" Interpreter - man kann das BF-Programm in gewisser Weise auch schon etwas Debuggen - Scripts sind via Drag&Drop ladbar - im Editor gibt's einige Tastenkodes - Strg+U und Strg+I zum Einrücken - Strg+G und Strg+B formatiert die markierten Zeilen - "field size" gibt die Speicher-/Rechengröße an (in Bit) - bitwidth simuliert 'ne größere "field size" (8x2 = 16 Bit und 8x4 = 32 Bit) - "file input" nutzt byteweise eine Datei statt der Eingabeaufforderung für "," - Eingaben ohne "inputbox" in das Output-Memo eingeben Die "Hilfe" wird noch gefüllt, also nicht wundern. Es kommen auch noch viel mehr Codes dazu und ein kleines BF-Einmaleins, sowie ein eigener BF-2-Pascal-BFCode. :mrgreen: Der Anfang läuft schon ... hab nur noch mit dem "IF-THEN" einige Problemchen:
Code:
[edit=mkinzler] Mfg, mkinzler[/edit]
>>>>>>>>>>>>++++++++++[<<<<<<<<<<<<+++>+++++>++++++>++++>+++
++++++++>+++++++++>+++++++++++>+++++++++>++++>++++++>+>+>>>+ ++>>++++++++++>++++++++++>+++++++++++>+++++++++++>++++++++++ ++>++++<<<<<<<<<-]<<<<<<<<<<<<+++++>-->+>>->+>++>+++>+>->+++ >>>+>++>>>+++++>>+++++>->----<<<<<< >>>++.++.---.-<--.++>>-.+<<<---.+++>>-.<<<<.>>>>.+>>++.--<<< <--.++++.--<<<<<<<.>.>.<.>.>>>>>>>>>++++.---->.<<<<<---.+++> >++..-->+.->++.--<<++.--<<+.-<<.>>-.+>>+.-.>.<+.---.++<<+.-> >>>++++++.------<<<<<<<<<<.>.<.>.>>>>>>>>>-.+<<<<---.+++>>>- .+<<<<<<<<<.>.>>>..>>>>-.+<<<<<<<<<-.+>>>>>.>>---.>>>-..+<<< .+++>>>>++.--<<<<<<<<<<<<<<<.<<<<.--..+++.-......>>>>>>.>>>> >>>.>>>>+.-<<++.--<<.>>-.+>-.+<---.+++>>>-.+<<<<<<<<<<.>.>.> >>..>>>>++.--<<<<<<<<<-.+>>>>>.>>>.>.>+.-<<<+.++.--.->>>-.+< <<<<<<<<<.>.>.<.>.>>>>>--.+++.->--.++.>.<<<<<<<<.>.>>>..>>>> ++.--<<<<.<<<<<-.+<<<<<<<.>>>>>>>>>>>>.<<<<<<<<<<<<<.>>>>>>> >.>.>.>>>> [-]<<-[>>+<<-]>>[<<<+>+>>-]<<<[>>..<<-]>>>>+.->>.<<.<<<<<<<< <<<<<<<--.++>>>>>>>>>.>. |
DP-Maintenance
Dieses Thema wurde von "Daniel" von "Open-Source" nach "Klatsch und Tratsch" verschoben.
Allein schon der Titel schreit nach der Offtopic-Sparte. |
Re: noch'n Hirnschiss
Das nur weil ich mal versuche deutsche Namen zu verwenden. :(
Matze privat und nicht als DP-Mod mit "delphi hirnschiss" is die DP bei Google nun echt oben und mit "hirnschiss" auf der Mitte der 1. Seite Dabei versuch ich doch nur die DP an die Spitze zu bringen und so bei der Weltherrschaft etwas behilflich zu sein. :cry: |
Re: noch'n BF Interpreter
Wir wollen aber nur positive Publicity. Habe den Titel mal etwas neutraler gefasst
|
Re: noch'n BF Interpreter
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Damit wäre man bestimmt sogar an vielen Erotikseiten vorbei, ganz weit nach vorne gekommen. :angel2: |
Re: noch'n BF Interpreter
Hi,
dein McKing Bestellprogramm funktioniert ja gar nicht. Egal was ich eingebe es wiederholt sich nur das Menü. Ob im 8 oder 64 Bit Modus. Oder hat mein neuer, optimierender Interpreter nen Bug? Ansonsten gehört das schon eher zurück nach Open-Source, oder? [ot] Gehirnfick fände ich ja noch ok, aber sch... klingt eklig und stinkt vermutlich. [/ot] |
Re: noch'n BF Interpreter
Komisch, du hast Recht ... irgendwie funktioniert das Read in der Console nicht richtig. :shock:
Read({char}); wartet bei Eingabe auf ein Enter und hört nicht schon nach Eingabe einer Taste auf. Dann wird anscheinend das erste Zeichen an die Char-Variable übergeben und den Rest merkt sich Delphi für die nächste Eingabe. Also bei Zeichen+Enter bleibt ein Enter übrig, welches für die nächste Eingabe genutzt wird, weswegen das nächste Menü gleich wieder abgebrochen wird. |
Re: noch'n BF Interpreter
Das Phänomen hat nix mit Delphi zu tun, das ist generell bei Konsolenprogrammen so. Willst du nur ein Zeichen lesen, musst du den Zeilenpuffer wieder leeren. Unter C hat man dafür den Befehlt fflush; Kennt Delphi da kein Äquivalent zu?
|
Re: noch'n BF Interpreter
Hi,
Unter (Turbo)Pascal gab es m. W. eine Funktion die nur ein einzelnes Zeichen gelesen hat (in der Crt?). Kennt jemand zufällig den Namen? Vielleicht gibt es das unter FreePascal ja noch? [edit] ReadKey? [/edit] [edit=2] Mit ReadKey funzt es besser. Aber achte bitte auf die Umlaute! (Brainfuck dagt eigentlich das es ASCII Ausgaben sind, da gibts keine, und unter der Console hast du andere Codepages als unter ANSI) Außerdem passiert bei x nichts und ich muss das Programm mit Strg+C abbrechen. [/edit] [edit=4] Na toll, jetzt funktioniert das Umleiten der Standardeingabe nicht mehr [/edit] [edit=3] Und heute bezahlt niemand mehr mit DM [/edit] Gruß FAlter |
Re: noch'n BF Interpreter
Zitat:
![]()
Delphi-Quellcode:
// initialisieren
H := GetStdHandle(STD_INPUT_HANDLE); FlushConsoleInputBuffer(H); // abfragen CI.EventType := KEY_EVENT; Repeat Until ReadConsoleInput(H, CI, 1, Cardinal(i)) and (i = 1) and (CI.Event.KeyEvent.bKeyDown) and (CI.Event.KeyEvent.AsciiChar <> #0); M[MP] := CI.Event.KeyEvent.AsciiChar; FlushConsoleInputBuffer(H); Zitat:
|
Re: noch'n BF Interpreter
Hi,
also die ReadKey aus FPC (Unit Crt) hat folgende Probleme: 1. wenn die Standardeingabe umgeleitet wird (z. B. von Datei) passiert nichts / wartet Programm entlos auf Eingabe 2. umgeht sie auch KeyMapping und gibt daher ggf. falsche Zeichen zurück
Delphi-Quellcode:
Das mit dem Flush gefällt mir bzgl. Standardeingabe umleiten auch nicht da ich vermute, dass dann was verloren gehen könnte...
// initialisieren
H := GetStdHandle(STD_INPUT_HANDLE); FlushConsoleInputBuffer(H); Es soll ja auch möglich sein mit BF Dateien zu verarbeiten. Abgesehen davon das der Code nur unter Windows läuft wird er sicher auch nicht besser sein:
Delphi-Quellcode:
KEY_EVENT? Gibts bei Standardeingabe umleiten auch nicht, oder?
// abfragen
CI.EventType := KEY_EVENT; Repeat Until ReadConsoleInput(H, CI, 1, Cardinal(i)) and (i = 1) and (CI.Event.KeyEvent.bKeyDown) and (CI.Event.KeyEvent.AsciiChar <> #0); M[MP] := CI.Event.KeyEvent.AsciiChar;
Delphi-Quellcode:
Und noch ein Flush?
FlushConsoleInputBuffer(H);
Also werden zweimal von Stdin eingelesene Daten weggeworfen? Ich werde folgendes machen: - wenn kein Parameter angegeben wurde wird read(Result) verwendet - wenn der Parameter .key angegeben wu8rde wird Result := ReadKey verwendet Damit erreiche ich Kompatibilität zu solchen Programmen während die Möglichkeit der Umlenkung der Standardeingabe nicht verloren geht. Letzteres hat aber einen Haken: BF kennt keinen Befehl um das Ende der Datei abzufragen. Die nach stdin umgeleitete Datei muss also selbst sagen wo sie zu Ende ist... [edit] Hab gerade festgestellt, das das Standardeingabe-umleiten auch mit read nicht zufriedenstellend funktionitert... hm, das ist aber komisch. Da hätte ich es eigentlich funktionierend erwartet... [/edit] Gruß FAlter |
Re: noch'n BF Interpreter
Hab zwar noch keine Funktion gefunden, welche prüft, ob umgeleitet wurde, aber FlushConsoleInputBuffer funktioniert bei einer Datei nicht, also würden da auch keine Zeichen verloren gehn, :-D
allerdings funktioniert ReadConsoleInput auch nicht und er ließt keine Zeichen ein = Endlosschleife. Jedenfalls scheint dieses nun in beiden Fällen zu laufen. :angel:
Delphi-Quellcode:
Hier wird mal mit Break abgebrochen, aber dem BF-Programm übergebe ich eine #0, welche dann das Dateiende signalisiert.
var H: THandle;
CI: TInputRecord; isRedirected: Boolean; i: Integer; C: Char; begin // initialisieren H := GetStdHandle(STD_INPUT_HANDLE); isRedirected := not FlushConsoleInputBuffer(H); while true do begin // abfragen if isRedirected then begin if EOF then begin {dateiende erreicht} //C := #0; break; end else Read(C); end else begin CI.EventType := KEY_EVENT; repeat until ReadConsoleInput(H, CI, 1, Cardinal(i)) and (i = 1) and (CI.Event.KeyEvent.bKeyDown) and (CI.Event.KeyEvent.AsciiChar <> #0); C := CI.Event.KeyEvent.AsciiChar; FlushConsoleInputBuffer(H); end; write(C); sleep(50); end; Allerdings dachte ich immer Read ließt nur das ein, welches man verlangt und ohne ein Enter zu fordern, so wie es auch bei einer Dateieingabe geschieht und nur ReadLn verlangt das Enter. :shock: Nja, hatte es aber auch noch nie so bei einer Konsoleneingabe verwendet. |
Re: noch'n BF Interpreter
Nützt aber nichts bei *nix Systemen. Daher ist es nicht für meine Plattformunabhängige Lösung geeignet. :-(
Aber wie gesagt bei Read funktiniert die Umleitung auch nicht sowie ich es mir wünsche. |
Re: noch'n BF Interpreter
Und da beschwere sich mal wer, daß ich erst garnicht versuche Cross-Plattform zu arbeiten. :wall:
Ach ja, mein "BF to pacal.bf" ist nun lauffähig (in 8 Bit). Es wandelt ein BF-Script in eine Pascal-DPR um. OK, meine IFs in BF sind noch sehr sehr unoptimal. Ist auch garnicht so einfach sowas in BF hinzubekommen. Aber die Laufzeit des Konverterscripts hat ja nicht mit der Laufzeit des Ergebnisses zu tun und ihr glaubt garnicht, wie schnell urplötzlich das "kleine" Mandelbrot-Programmchen sein kann. :shock: Und das, obwohl noch nichtmal optimiert wird. ( also z.B. Inc(P) + Inc(P) = Inc(P, 2) usw. ) Witzig ist dabei, daß dieser Konverter nur mit 32 Byte und einem Pointer auskommt und wenn man unbedingt wöllte, dann würden auch 4 Byte plus den Zeiger ausreichen. :angel2: Also, obwohl es nicht grade sehr optimal arbeitet, bis ich doch recht zufrieden damit ... ist ja immerhin mein erstes richtiges BF-Programm. :) In meinem BF-Interpreter kann aber jetzt eine derartige Optimierung aktiviert werden und auch Strg+(Shift)+G, bzw. +B entfernen jetzt nicht nur Text/Kommentare und faßt alles zusammen, sondern es entfernt jetzt auch offensichtlich unnötige BF-Befehle. ( z.B. >>< zu > ) dieses fibonacci.bf
Code:
sieht in Delphi dann so aus
++++++++++>>+>>+
[ [ +++++[<++++++++>-]<. >++++++[<-------->-] +<<< ]<.>>>> [ -<[<+>>+<-] <[>+<-[>+<-[>+<-[>+<-[>+<- [>+<-[>+<-[>+<-[>+<- [>[-]>>+>>[-]+<<<<<- [>+<-]]]]]]]]]]] >>[<<+>>-] +>>> ]<<< ]
Delphi-Quellcode:
Und es ist garnicht so einfach NUR mit diesen Variablen
program mybf;
{$apptype console} var m: array[0..1000000] of char; p: integer; begin p := 0; inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); inc(p); inc(p); inc(m[p]); inc(p); inc(p); inc(m[p]); while m[p] <> #0 do begin while m[p] <> #0 do begin inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); while m[p] <> #0 do begin dec(p); inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); inc(p); dec(m[p]); end; dec(p); write(m[p]); inc(p); inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); inc(m[p]); while m[p] <> #0 do begin dec(p); dec(m[p]); dec(m[p]); dec(m[p]); dec(m[p]); dec(m[p]); dec(m[p]); dec(m[p]); dec(m[p]); inc(p); dec(m[p]); end; inc(m[p]); dec(p); dec(p); dec(p); end; dec(p); write(m[p]); inc(p); inc(p); inc(p); inc(p); while m[p] <> #0 do begin dec(m[p]); dec(p); while m[p] <> #0 do begin dec(p); inc(m[p]); inc(p); inc(p); inc(m[p]); dec(p); dec(m[p]); end; dec(p); while m[p] <> #0 do begin inc(p); inc(m[p]); dec(p); dec(m[p]); while m[p] <> #0 do begin inc(p); inc(m[p]); dec(p); dec(m[p]); while m[p] <> #0 do begin inc(p); inc(m[p]); dec(p); dec(m[p]); while m[p] <> #0 do begin inc(p); inc(m[p]); dec(p); dec(m[p]); while m[p] <> #0 do begin inc(p); inc(m[p]); dec(p); dec(m[p]); while m[p] <> #0 do begin inc(p); inc(m[p]); dec(p); dec(m[p]); while m[p] <> #0 do begin inc(p); inc(m[p]); dec(p); dec(m[p]); while m[p] <> #0 do begin inc(p); inc(m[p]); dec(p); dec(m[p]); while m[p] <> #0 do begin inc(p); inc(m[p]); dec(p); dec(m[p]); while m[p] <> #0 do begin inc(p); while m[p] <> #0 do begin dec(m[p]); end; inc(p); inc(p); inc(m[p]); inc(p); inc(p); while m[p] <> #0 do begin dec(m[p]); end; inc(m[p]); dec(p); dec(p); dec(p); dec(p); dec(p); dec(m[p]); while m[p] <> #0 do begin inc(p); inc(m[p]); dec(p); dec(m[p]); end; end; end; end; end; end; end; end; end; end; end; inc(p); inc(p); while m[p] <> #0 do begin dec(p); dec(p); inc(m[p]); inc(p); inc(p); dec(m[p]); end; inc(m[p]); inc(p); inc(p); inc(p); end; dec(p); dec(p); dec(p); end; end.
Delphi-Quellcode:
und diesen Befehlen
var
m: array[0..1000000] of char; p: integer;
Delphi-Quellcode:
ein Programm hinzubekommen,
{ > } inc(p);
{ < } dec(p); { + } inc(m[p]); { - } dec(m[p]); { . } read(m[p]); { , } write(m[p]); { [ } while m[p] <> 0 do begin { ] } end; aber da es sich hier um eine turingfähiges Programm handelt, sollten sich damit in endlicher Zeit (kann allso etwas länger dauern) ALLE möglichen Programme/Berechnungen bewerkstelligen lassen. |
Re: noch'n BF Interpreter
Liste der Anhänge anzeigen (Anzahl: 1)
Ein Debugger (wenn man es so nennen darf), ist jetzt mit drinnen.
Also schrittweises Durchsteppen der BF-Codes und Haltepunkte (im "run"-Modus) sind möglich. - "Instruction" = wenn der die Abarbeitung grad/gleich diese Instruction ausführen will - "Memory" = wenn diese Speicherstelle gleich verändert werden soll @FAlter: hab auch ein paar Interpreter-Testcodes gemopst, etwas aufbereitet und mit eingefügt (Verzeichnis "Tests") Wobei der Testcode für die obere Speicherbegrenzung wohl nicht viel ausmacht, da wir ja eine dynamische Speicherverwaltung drin haben, aber schaden kann er dennoch nicht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz