Brainfuck Syntax Check



  • Hallo,

    ich bin grade etwas verwirrt, es reicht doch schon wenn es gleich viele "[" wie "]" gibt, oder?

    Gruß



  • Ist ][ ein gültiges Programm?



  • Ach ich wusste doch so einfach ist es nicht 😃

    Danke & Gruß



  • openBrackets = 0;
    gueltig = true;
    while((c = nextChar()) != 0)
    {
        if(c == '[') ++openBrackets;
        if(c == ']') --openBrackets;
    
        if(openBrackets < 0) gueltig = false;
    }
    
    if(openBrackets != 0) gueltig = false;
    

    MfG SideWinder



  • So hab ichs nun auch gemacht. Das einzige was man nun noch machen könnte wäre "[]". Aber ich glaube das ist gültig, auch wenn es kein Sinn macht. Wäre ja wie while(var); in C++.

    Gruß



  • SideWinder schrieb:

    openBrackets = 0;
    gueltig = true;
    while((c = nextChar()) != 0)
    {
        if(c == '[') ++openBrackets;
        if(c == ']') --openBrackets;
    
        if(openBrackets < 0) gueltig = false;
    }
    
    if(openBrackets != 0) gueltig = false;
    

    MfG SideWinder

    die openBrackets < 0 Abfrage ist aber überflüssig



  • Wenn ][ kein gültiger Code ist dann nicht.

    MfG SideWinder



  • ups, stimmt.



  • Ein moderner Brainfuck-Compiler sollte sich auch noch um < > kümmern (was passiert bei <+?) 😃



  • jede eingabe ist in bf syntaktisch korrekt.
    könntest eine warnung ausgeben nach SideWinder code.

    //nur leicht modifiziert
    bool foo(){
       int openBrackets = 0;
       while((c = nextChar()) != 0)
       {
          if(c == '[') ++openBrackets;
          if(c == ']') {
             --openBrackets;
            if(openBrackets < 0)
               return false;
          }
       }
       return openBrackets>=0; 
    }
    

    aber < und > kannste nicht testen, die können von der eingabe abhängen.
    ,[>-]<
    bei eingabe von '\0' crasht es, sonst crasht es nicht.



  • volkard schrieb:

    aber < und > kannste nicht testen, die können von der eingabe abhängen.

    Man kann aber gegebenfalls eine Warnung ausgeben. In den mit Abstand meisten Fällen dürfte < != > nämlich ein Fehler sein. Eine Warnung ist also wirklich angebracht.
    Und ][ macht nunmal keinen Sinn, ist also durchaus als Fehler zu werten.



  • Also ich sehe "][" als Fehler an, denn man muss ja irgendwo zurückspringen können, und das geht wohl nicht. (Also wenn es allein so nur der Code ist)
    Warum sollte es bei ",[>-]<" crasehn wenn man 0 eingibt? Dann gibts eben nen Underflow, macht ja nichts oder? 😕

    Edit -> Achso ich hab den Code irgendwie ganz falsch gelesen - lol. Ich hab irgendwo gelesen dass Der Speicher auf 30000Bytes beschrnkt sein soll. Bei meinem Interpreter hab ich einfach ne Setting gemacht, die den Speicher bestimmt.

    Gruß



  • FireFlow schrieb:

    Warum sollte es bei ",[>-]<" crasehn wenn man 0 eingibt? Dann gibts eben nen Underflow, macht ja nichts oder? 😕

    Weil's ein Buffer Overflow und kein Underflow ist. Beachte die Schleife und das >.



  • Also nochmal... ",[>-]<"

    Wenn man 0 eintippt wird die Schleife übersprungen und der Pointer wird zurückgeschoben auf das Element das es gar nicht gibt. -> Gibt nen Runtime Error bei mir.

    Tippt man nicht 0 ein kommt das ganze in eine endlos-Schleife. Irgendwo hörts dann aber bei mir mit nem Runtime Error auf weil der Speicher begrenzt ist.

    Soll sowas erkannt werden können? Wüsste nicht wie ich das hinbekomm, ich hab doch keine Ahnung 🤡

    Gruß



  • sarfuan schrieb:

    Man kann aber gegebenfalls eine Warnung ausgeben. In den mit Abstand meisten Fällen dürfte < != > nämlich ein Fehler sein. Eine Warnung ist also wirklich angebracht.

    jo. hab meine lib mal durchgelesen und < und > waren immer gleich viele.

    Und ][ macht nunmal keinen Sinn, ist also durchaus als Fehler zu werten.

    fehler isses genau genommen keiner. nach endlosschleifen kannste machen, was du willst.
    yes.bf

    //ungetestet
    [>++++++++++[->+++<]>[-<++++>]<+.[-]+]]]]]]]]]]]]]]]]]]]]]]]]]
    


  • Hmm ist es nun syntaktisch falsch so etwas zu bauen oder nicht:

    ,[
        // mache irgendwas
    ]
    ] // ist das erlaubt? wohin soll man denn springen?
    

    Ach ja und: Kann man in C++ mit der Standard Library noch irgendwelche Eingaben in der Konsole machen, die nicht mit <Return> bestätigt werden müssen?

    Gruß



  • volkard schrieb:

    jo. hab meine lib mal durchgelesen und < und > waren immer gleich viele.

    Wobei es natürlich mehr > als < geben darf (sofern das Array nicht überschritten wird). Also unkorrekte Schleifen werden verboten, mehr "<" als ">" löst eine Warnung aus und die verschiedenen Zeilenumbruchformate werden berücksichtigt. So sieht mein Brainfuck-Compiler aus und das funktioniert auch und gerade in der Praxis hervorragend.

    fehler isses genau genommen keiner. nach endlosschleifen kannste machen, was du willst.

    Ja sicher, aber das gilt für einge Programmiersprache. Dennoch werden alle Compiler meckern. Bei einem Interpreter mag das ja anders sein, aber ich rede ja auch von Compilern. 😉



  • sarfuan schrieb:

    So sieht mein Brainfuck-Compiler aus und das funktioniert auch und gerade in der Praxis hervorragend.

    Hätte nie gedacht, dass ich das Wort mal in einem Satz mit "Brainfuck" finde 🤡 .


Anmelden zum Antworten