Entwickler-Ecke

Alle Sprachen - Alle Plattformen - Java Brainf*ck übersetzen


LINUS19 - So 28.01.18 16:35
Titel: Java Brainf*ck übersetzen
Hallo,
ich wollte einen sehr einfachen Übersetzer für Brainfuck in Java machen(https://de.wikipedia.org/wiki/Brainfuck).
Hello World(++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.) zu übersetzen funktioniert, oder auch Zeichen einlesen und wieder ausgeben([,.]), aber bei anderen Programmen hängt es sich auf oder gibt ein ArrayIndexoutBoudsException züruck.
Hier die Interpretiere Methode:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
public static char[] interpretiere(char array[]) throws IOException {

    DataInputStream input = new DataInputStream(System.in);
    DataOutputStream out = new DataOutputStream(System.out);

    int speicher[] = new int[32000];
    int zeiger = 0;

    for (int i = 0; i < array.length; i++) {
      
      switch (array[i]) { // alle 8 Befehle

      case '.': 
        System.out.print((char) (int) speicher[zeiger]); // Ausgabe        
        break;

      case ',': // Zahl wird eingelesen
        speicher[zeiger] = (char) input.read();        
        break;

      case '[': Schleife
        int n = 1;
        while (n > 1)
          if (speicher[zeiger] == 0) {
            if (array[++i] == ']')
              n--;
          } else if (speicher[zeiger] == '[') {
            n++;
          }
        break;

      case ']':
        int m = 1;
        while (m > 0 && speicher[zeiger] != 0) { 
          if (array[--i] == '[') {
            m--;
          } else if (array[i] == ']')
            m++;
        }
        break;

      case '>':
        zeiger++;
        break;

      case '<':
        zeiger--;        
        break;

      case '+': // Speicherzelle wird um 1 erhöht
        speicher[zeiger]++;        
        break;

      case '-': // Speicherzelle wird um 1 erniedrigt
        speicher[zeiger]--;        
      }

    }
    return array;

  }

Schonmal Danke im Vorraus

LG
LINUS19


Delete - So 28.01.18 18:22

- Nachträglich durch die Entwickler-Ecke gelöscht -


LINUS19 - So 28.01.18 20:51

Guten Abend Frühlingsrolle,

In welcher Zeile das Auftritt weißich nicht mehr, weil ich einige Programme getestet hab und nicht mehr weiss wo der Fehler auftrat. Die Fehlermeldung bedeutet ja dass das Array einen falschen Index hat. Wahrscheinlich ist mit den Schleifen,also mit '[' und ']', auch noch was falsch, weil das Programm sonst ja nicht manchmal in eine Endlosschleife geraten würde.


Delete - So 28.01.18 21:04

- Nachträglich durch die Entwickler-Ecke gelöscht -


LINUS19 - So 28.01.18 23:24

Ich habe das jetzt so geändert: if (array[++i] == ']' && i<array.length) , bei case '+', '-' und '[' war es ja auch das selbe Problem, trotzdem taucht bei einigen Programmen eine Endlosschleife auf.
z.B bei diesem Programm, es soll das Sierpinski Dreieck ausgeben:

Quelltext
1:
2:
3:
4:
5:
 ++++++++[>+>++++<<-]>++>>+<[-[>>+<<-]+>>]>+[
    -<<<[
        ->[+[-]+>++>>>-<<]<[<]>>++++++[<<+++++>>-]+<<++.[-]<<
    ]>.>+[>>]>+
]

Es läuftt einfach immer weiter nd es passiert nichts(auch keine Fehlermeldung).


Delete - Mo 29.01.18 00:13

- Nachträglich durch die Entwickler-Ecke gelöscht -


LINUS19 - Mo 29.01.18 00:17

Stimmt das muss n>0 sein.


Delete - Mo 29.01.18 00:30

- Nachträglich durch die Entwickler-Ecke gelöscht -


LINUS19 - Mo 29.01.18 00:51

Das soll für in einnander geschachtelten Schleifen sein.
Wahrscheinlich kommt wegen den geschachtelten Schleifen weiter oben,die Endlosschleife zustande.Bei Helloworld funktioniert die Schleife ja.

Edit: Bin das jetzt mit dem Debugger durchgegangen und die while() Schleife bei bei case'[' wird nicht verlassen.


Delete - Mo 29.01.18 18:32

- Nachträglich durch die Entwickler-Ecke gelöscht -


LINUS19 - Mo 29.01.18 18:50

Habe es jetzt verändert. aber das Programm befindet sich immer noch in einer Endlosschleife.
Wäre es übersichtlicher einen Stack für die Schleifen zu verwenden?


Delete - Mo 29.01.18 22:47

- Nachträglich durch die Entwickler-Ecke gelöscht -


LINUS19 - Di 30.01.18 19:20

Danke dir. Strings zu verwenden ist natürlich besser als char, weil man dann auch die ganzen Stringmethoden hat(z.B charAt() wie du verwendet hast).
Ich verstehe nur nicht, warum du ein Bytearray nimmst und nicht ein int Array. Was ist der Vorteil davon?
Und muss man nicht den zeiger und den speicher bei bestimmten Fällen wieder auf Null setzen, damit kein Überlauf entsteht?


Delete - Di 30.01.18 22:13

- Nachträglich durch die Entwickler-Ecke gelöscht -


LINUS19 - Di 30.01.18 23:49

Mir ist gerade aufgefallen das bei deinem Programm die Eingabe nicht funktioniert. Z,b bei diesem Programm: [,.]
werden keine Zeichen eingelsen.


Delete - Mi 31.01.18 00:01

- Nachträglich durch die Entwickler-Ecke gelöscht -


LINUS19 - Mi 31.01.18 00:25

sorry habe mich versehen. Aber diese Bubblesort Programm gibt bei deinem Programm String index out of range aus, in Zeile 66 dort wo die Zeichen eingelsen werden und funktioniet z,B bei diesem Compiler: https://sange.fi/esoteric/brainfuck/impl/interp/i.html


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
>>,[>>,]<<[
[<<]>>>>[
<<[>+<<+>-]
>>[>+<<<<[->]>[<]>>-]
<<<[[-]>>[>+<-]>>[<<<+>>>-]]
>>[[<+>-]>>]<
]<<[>>+<<-]<<
]>>>>[.>>]


Delete - Mi 31.01.18 00:32

- Nachträglich durch die Entwickler-Ecke gelöscht -


LINUS19 - Mi 31.01.18 00:49

Hier ein Screenshot:


Delete - Mi 31.01.18 00:53

- Nachträglich durch die Entwickler-Ecke gelöscht -


LINUS19 - Mi 31.01.18 00:58

Ja, aber bei deinem Programm konnte ich ja keine Zahlen eingeben weil die Fehlermeldung kam.


Delete - Mi 31.01.18 01:07

- Nachträglich durch die Entwickler-Ecke gelöscht -


LINUS19 - Mi 31.01.18 01:11

Wie meinst du das genau mit umwandeln?


Delete - Mi 31.01.18 01:19

- Nachträglich durch die Entwickler-Ecke gelöscht -


Symbroson - Mi 31.01.18 10:32

Zur 1 kann man aber auch einfacher gelangen:

Quelltext
1:
+++++++[>+++++++<-]>.                    


LINUS19 - Mi 31.01.18 14:54

Ich verstehe immer noch nicht warum man die Eingabe erst zu BF umwandeln muss, das ist doch viel zu umständlich. Bei meinem Programm aus Post1 konnte ich die Echoschleife von Wikipedia ausführen ([,.]) Die Zeichen konnten eingelesen werden und wieder ausgegeben werden. Aber bei deinem Programm verwendest du glaube ich, keine Einlesefunktion, ich hatte ja den DatainputStream verwendet.

LG
Linus


Delete - Mi 31.01.18 16:55

- Nachträglich durch die Entwickler-Ecke gelöscht -


Delete - Do 01.02.18 03:28

- Nachträglich durch die Entwickler-Ecke gelöscht -