Hello, Guest the thread was called3.9k times and contains 31 replays

last post from Larry at the

BASIC ohne Zeilennummern schreiben

  • Hier mal ein einfacher BASIC-Präprozessor, der in Verbindung mit petcat das Entwickeln von Basic-Programmen am PC vereinfachen kann.


    Statt Zeilennummern zu verwenden kann man damit Basic auch so schreiben:


    Datei "example.bpp":



    Datei "screen.bpp":


    Code
    1. clear: print "{clr}";: return
    2. theme: poke53280,0: poke53281,0: poke646,5: return


    Aufruf:


    Code
    1. $ bpp < example.bpp


    Erzeugt:



    Mit dem folgenden Aufruf kann aus dem ursprünglichen Dateien direkt ein PRG erzeugt werden:


    Code
    1. $ bpp < example.bpp | petcat -w2 > example.prg


    Es können übrigens auch Binärdateien direkt als DATA-Zeilen eingebunden werden:


    Code
    1. !include data "sprite.bin"


    Der Präprozessor ist als einfacher Filter implementiert (Standard Ein/Ausgabe) und in ruby programmiert.


    Bei Interesse findet ihr alles weitere auf github

  • Ich wär ja dafür, GOTO zu enfernen und dafür Strukturmakros hinzuzufügen (die dann natürlich u.U. auch zu GOTOs konvertiert würden), dann wird aus den Basic-Programmierern vielleicht doch noch was... :whistling:


    Disclaimer: Ja, mir ist durchaus bewusst, dass GOTO auch in höheren Programmiersprachen mal sinnvoll eingesetzt werden kann.

  • Der Präprozessor weiß von Basic eigentlich nur, dass es zeilenbasiert ist, wie die Schlüsselworte heißen (d.h. welche Worte nicht als Labels gelten dürfen) und dass es aus String-Literalen und irgendwelchen anderen Zeichen ("Code") aufgebaut ist und an welchen Stellen in diesem "Code" (on/goto/gosub/then) Labels stehen könnten, die dann aufzulösen sind. Er würde also auch fröhlich irgendwelchen Klumpatsch parsen, durchnummerieren und ausgeben, solange er alle Label-Referenzen, die er darin zu finden glaubt, zu Zeilennummern auflösen kann.


    Es ist also lange kein vollständiger Basic-Parser und er weiß daher auch garnicht, was ein "goto" im Gegensatz zu einem "gosub" überhaupt im Hinblick auf den Programmfluß bedeutet und welche gotos u.U. daher überflüssig wären. Ist halt "nur" ein kleiner Präprozessor, der diese fürchterlichen Zeilennummern überflüssig macht :)

  • Jetzt fehlt nur noch, dass der "goto" in diesem Fall wegoptimiert wird ;


    Code
    1. 26 print"cheer up!":goto27
    2. 27 return


    ("Compileroption" -O2 ? ;) )


    Das hier ist auch ziemlich sinnbefreit...


    Code
    1. 0 goto3
    2. 1 print"{clr}";:return
    3. 2 poke53280,0:poke53281,0:poke646,5:return
    4. 3 gosub1
    5. 4 gosub2
    6. 5 ...

  • Das hier ist auch ziemlich sinnbefreit...


    Code
    1. 0 goto3
    2. 1 print"{clr}";:return
    3. 2 poke53280,0:poke53281,0:poke646,5:return
    4. 3 gosub1
    5. 4 gosub2
    6. 5 ...


    Natürlich ist das sinnfrei, es handelt sich ja auch um ein Beispiel. Es sollte damit nur gezeigt werden, wie eine externe Datei als Bibliothek von Subroutinen in einen beliebigen Namensraum eingebunden werden kann.

  • In TSB kann man das fast genauso hinkriegen (das Nachladen ins Programm ginge auch: per MERGE, hab ich hier aber mal weggelassen). Die etwas modifizierten Labelnamen müssen sein, da ein Label in TSB nicht mit einer TSB-Kommando-Bezeichnung anfangen darf. Eine CASE-Konstruktion per ON geht auch nicht, da muss ich auf Einzelvergleiche runtergehen. Kommt dann das dabei raus:



    Das hier soll nicht heißen, dass ich Hennings Idee blöd finde, im Gegenteil! :ilikeit: Ich wollte nur sagen, dass es BASIC-Dialekte gibt, die sich über die Zurückdrängung der Zeilennummern auch schon mal halbwegs erfolgreich Gedanken gemacht haben. :)


    Arndt


    (Edit)

  • Mit ERROR


    Echt? Oder zweifelst du selber gerade?


    Würde ja heißen, auch z. B. keine "AT", "DO", "DIR", "LIN" irgendwo IM Label...? Hmm, muss man dann ja etwas aufpassen.

  • GoDot : Interessant, das TSB kannte ich bisher noch nicht. Ich habe auch erhlich gesagt nicht weiter geguckt, ob es schon ähnliche Ansätze gibt, die Idee kam mir, als ich mal etwas mit petcat rumgespielt habe. Vorteil gegenüber TSB ist natürlich, dass einfach normales Basic erzeugt wird und keine speziellen ROMs benötigt werden.


  • Echt? Oder zweifelst du selber gerade?


    Würde ja heißen, auch z. B. keine "AT", "DO", "DIR", "LIN" irgendwo IM Label...? Hmm, muss man dann ja etwas aufpassen.


    Nein, nein, kein Zweifel! Ein Schlüsselwort darf nur nicht am Anfang des Labels stehen! Bei dem Label "done" von Henning musste ich ja auch "d'one" draus machen. Das ON in der Mitte stört dann nicht mehr. Hennings Label "one" ging wiederum nicht, daraus wurde also "'one".


    Bei AT ist die folgende Klammer Teil des Schlüsselworts (diese Tatsache muss ich mal im C64-Wiki ergänzen, fällt mir dabei auf, eine Leertaste zwischen AT und Klammer ist ein Syntax-Fehler!), AT allein reicht nicht zur Token-Umwandlung.


    Henning : Deine Idee ist super! Ein bisschen so wie ein Precompiler für strukturierte Programmierung! :thumbsup:


    Arndt


    Edit: Ich hätte besser überall nur ein Apostroph davorsetzen sollen, das reicht ja völlig: also 'error, 'done, 'one... Ja, ja, die Kleinigkeiten, die das Leben einfacher machen... :)

  • Hallo zusammen,


    ich bin gerade über den BPP gestolpert auf der Suche nach genau so einem Tool, ohne auf Windows zurückgreifen zu müssen.
    Allerdings habe ich folgendes Problem mit bpp:


    Ich habe einen etwas längeren BASIC Code mittels PETCAT in ein Text File umgewandelt um dann am PC damit arbeiten zu können.
    Die BASIC Zeilennummern wurden entfernt und GOTO / GOSUB Adressen durch Labels ersetzt.
    Kommentare sind per Semikolon in eigenen Zeilen eingefügt worden.
    Das bearbeitete File ist als blabla.bpp gespeichert.


    Dann auf der Kommandozeile: bpp < blabla.bpp
    Dann tut sich scheinbar nicht mehr viel. Cursor erscheint und ich kann wie in einem Texteditor schreiben. Mit STRG+C komme ich wieder raus.
    Per bpp < blabla.bpp | petcat -w2 > blabla.prg
    wird ein prg File mit 0 Bytes erzeugt.
    Woran kann es liegen, dass bpp hängt ?