Hallo Besucher, der Thread wurde 9,2k mal aufgerufen und enthält 37 Antworten

letzter Beitrag von Larry am

BASIC ohne Zeilennummern schreiben

  • noch ein Versuch:


    Das Example.bpp lässt sich wunderbar mit bpp < example.bpp verarbeiten. Weiterverabeitung mit petcat über die Pipe geht auch.


    Mein simpler code aber nicht:


    print"hallo"
    loop: geta$:if a$=""then goto loop


    bpp bleibt immer am ersten Label im code hängen, egal was ich mache. Da bpp aber prinzipiell funktioniert mit den vorgegebenen Beispielen, raff ich nicht was ich scheinbar falsch mache.


    Tipps wären echt hilfreich.

  • Es sieht für mich so aus, als ob das Problem an der Verarbeitung von IF THEN Abfragen liegt.
    Hier mal ein Beispiel das auf Fehler läuft:



    Code
    1. prnt: print"hallo":a=0
    2. if a=0 then b=1

    Führt zu:


    0 print"hallo":a=0


    error: line 1: could not resolve label 'b'




    Das Beispiel aus Beitrag #21 führt scheinbar in eine bpp interne Endlosschleife.
    Mist, damit kann ich nun wieder rund 1.200 Zeilen Code von Hand mit Zeilennummern versehen :cry:
    @Henning sind für BPP noch Bugfixe geplant ?

  • Tja leider tut sich hier nicht viel. Eigentlich hat das Tool nur 2 kleine Bugs. Da ich aber in Ruby so fit bin wie ein ausgelatschter Turnschuh, frage ich mal in die Runde, wer hier ggf. helfen mag ?!


    Es werden Leerstrings wie i$="" nicht korrekt erkannt / übersetzt. Vermute da stimmt was mit dem escapen nicht ganz
    Und das "THEN" für zu Fehlern in der Übersetzung ins BASIC File. Völlig ohne THEN geht es, ist aber unschön. Alles nach THEN wird als Label / Sprungmarke erkannt bzw. gesucht auch ein If a=0 then b=1....


    Mehr eigentlich nicht.

  • Tja leider tut sich hier nicht viel. ...

    Tja, das mag daran liegen, daß Henning gerade wichtigere Dinge im Kopf hat...
    Und bitte nicht auf den angekündigten Zeitrahmen rumhacken: erstens kommt es immer anders und zweitens als man denkt.


    Leider kann auch ich Dir nicht mit RUBY helfen. Um es auch mit Bildersprache zu umschreiben: Ich bin darin so fit wie der Feldstein am Wegesrand.

  • Zitat:"It’ll be about one or two months from now."
    Datum: Jul 24, 2018


    Ich habe den Henning vor ca. einem halben Jahr dazu mal angeschrieben -> keine Rückmeldung.
    Klar, so'n Umzug, renovieren, einrichten etc. pp. ggf. Haus bauen kostet Zeit, kenne ich selbst.


    Deshalb ja meine Suche nach alternativer Hilfe.

  • "...then let..." führt nach wie vor zu:
    error: line 1: could not resolve label 'let b'


    Die Variante mit i$ würde zwar gehen in einer Abfrage, aber ich will ja auch manchmal i$ "leeren" mittels i$=""....

  • Das würde tatsächlich funktionieren, d.h. alles nach "THEN" wird nicht mehr als Label gesucht. Ist aber nicht wirklich schön, da "nur" Workaround.
    Trotzdem schon mal danke für den Tip.
    Und i$=xy$ geht natürlich so auch.

  • Ich muss das Thema noch einmal hoch holen. BPP ist vom H.Bekel leider bisher noch nicht korrigiert worden. Die Workarounds um die Fehler im Script zu umgehen, sind nicht wirklich schön.
    Es gibt Befehle, die nach einem THEN sauber verarbeitet werden, andere nicht. Und ich kann anhand des Ruby Codes nicht erkennen, woran das liegt (da fehlt mir einfach das Verständnis für Ruby und wie dort RegEx verwendet werden).


    Hier eine Liste der Befehle die gehen (ohne Semikolon) und welche wo nach THEN nach einem Label gesucht wird (mit Semikolon), jedenfalls die, die ich bisher ausprobiert habe:


    GET# fehlt als Keyword im Code, das hatte ich schon erweitert. Sinnigerweise wird GET# verarbeitet, GET dagegen nicht.
    ST, TI und TI$ fehlen ebenfalls als Keyword.


    C64 Studio als Alternative lässt sich zum verrecken nicht unter Linux starten. Aber es gefällt mir auch ehrlich gesagt nicht, wobei das nur mein persönlicher Geschmack ist...
    Mir ist halt Notepad++ lieber und wäre mit BPP perfekt, um damit größere BASIC Projekte anzugehen, ohne bei Erweiterungen / Änderungen am Code mit Zeilennummern hantieren zu müssen.

  • Ich habe mich heute mal wieder ans BASIC coden gemacht. Wie gehabt, den Code als BPP in einem Codeditor geschrieben mit den beiden Workarounds für then und 2 double Quotes ("").

    Das THEN: ersetze ich in der Zieldatei (nach BPP) per sed so:


    Code
    1. sed -i s/then:/then/g file.bas

    Das klappt auch soweit.

    Mit den "" habe ich so meine Schwierigkeiten. Damit BPP funktioniert, schreibe ich Zeilen wie

    a$=""

    als

    a$=du$

    wobei du$ immer leer bleiben muss, damit das im Programm hinterher auch funktioniert.

    Daher würde ich gerne das du$ wieder per sed in ein "" ersetzen, damit nachher der ganze Übersetzungsprozess (bpp, sed, petcat, compile, c1541) in einem Skript laufen kann.


    Ich habe schon x Versuche durch, aber du$ wird nicht in ein "" ersetzt.


    Hier mal zwei meiner erfolglosen sed Versuche:


    Code
    1. sed "s/du$/\'""'/g" file.bas
    2. sed 's/du$/""/g' file.bas


    Wie müsste das denn richtig lauten?

  • Kleine Antwort an mich selbst.... der ca. 30 Versuch hat's scheinbar gebracht.


    Code
    1. echo "a$=du$" |sed 's/du\$/""/g'
    2. bzw.
    3. sed 's/du\$/""/g' file.bas

    Das "$" hätte ich escapen müssen, nicht das "". Naja, wieder was gelernt :)

  • Es werden Leerstrings wie i$="" nicht korrekt erkannt / übersetzt.

    Änder mal Zeile 310 von

    if (match = /^["](?<string>[^"]+)["]/.match(@text))

    zu

    if (match = /^["](?<string>[^"]*)["]/.match(@text))


    Falls der Woltlappen jetzt was zerhaut: Es geht nur darum, das Pluszeichen durch ein Sternchen zu ersetzen. Das Pluszeichen sagt, dass zwischen Doublequotes mindestens ein Zeichen stehen muss (also keine Leerstrings erkannt werden), bei einem Sternchen sind auch "Null Zeichen" erlaubt.


    Ich hab das jetzt nicht groß getestet, das überlass ich Dir. ;)

  • Es gibt Befehle, die nach einem THEN sauber verarbeitet werden, andere nicht.

    Eine Möglichkeit wäre, Zeile 314 zu ändern von

    elsif (match = /^(?<code>then\s*(go(sub|to))|then|go(sub|to))\s*(?<labels>[\w\s,.]+)+/

    zu

    elsif (match = /^(?<code>go(sub|to))\s*(?<labels>[\w\s,.]+)+/


    Dann werden Labels nur noch hinter GOTO und GOSUB erwartet, nicht mehr hinter THEN. Sowas wie IF condition THEN target funktioniert dann natürlich nicht mehr, da muss man dann IF condition GOTO target oder IF condition THEN GOTO target schreiben. Ein richtiger Fix ist das also nicht, aber vielleicht hilft es ja.

  • Mac Bacon : :thumbsup: Funktioniert beides perfekt. Das hinter THEN nun ein GOTO gehört, ist für mich vollkommen OK. Leerstrings funktionieren auch.

    So kann man endlich mit BPP arbeiten.


    1000 Dank !

  • Noch ein kleiner Nachtrag: einen Bug hatte ich selbst erledigen können:


    Zeile 333:

    Code
    1. #elsif (match = /^(?<separator>:+)/.match(@text)) #original
    2. elsif (match = /^(?<separator>:)/.match(@text)) #bugfix problem with ::
    3. self << Code.new(":")
    4. @text = match.post_match.strip

    Codezeilen mit 2 ":" hintereinander verursachten auch Probleme. Braucht man das ? Ja, wenn man z.B. den Code kompilieren will und BASIC Extensions benutzt (z.B. JiffyDOS Befehle, C*BASE etc.).