Editor für BASIC programme mit netten Features...

Du hast eine Idee für ein Projekt?
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Eigentlich dachte ich, sollte es das schon geben... Habe aber nichts gefunden.

Ich hätter gern ein Text Editor der ein paar besondere Features für das Programmieren von BASIC programmen hätte.

Das wichtigste: Automatisierte Zeilennummern.
i.d.R. haben BASIC Interpreter den Eingebauten Befehl RENUM, damit werden alle Programmzeilen und GOTO/GOSUB Aufrufe umnummeriert.
Im Text editor sollte das vollkommen automatisch funktionieren.

In meinem Fall: Extended Color BASIC von Microsoft (s. http://de.wikipedia.org/wiki/Microsoft_BASIC ) ist es so, das bei Variablennamen nur die ersten beiden Zeichen (!) Berücksichtlicht werden :shock:
Deswegen hätte ich gern, das die ersten Beiden Zeichen hervorgehoben werden und auch ein "Verwechselungs Test" gemacht wird. Halt das Gewarnt wird, wenn man FOO=2 und FOOBAR = 2 gemacht wird.

Das ganze könnte ich später dann direkt an DragonPy koppeln, damit man direkt live das Programm testen kann.

Lokale-Links:
* DragonPy Emulator: http://www.python-forum.de/viewtopic.php?f=1&t=32089
* BASIC Lexer/Tokenizer: http://www.python-forum.de/viewtopic.php?f=1&t=32173

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

@jens: Für Zeilennummern habe ich mir einen ganz einfachen Präprozessor geschrieben der Programme ohne Zeilennummern mit Labels in welche mit Zeilennummern übersetzt.

Ich hatte da auch immer mal vor so etwas für Variablennamen zu machen. Also das lange zu kurzen gemacht werden. Entweder welche die man selber festlegt, beziehungsweise wenn man das nicht machen möchte, dann einfach generierte kurze Namen.

Das könnte man dann noch beliebig ausbauen. Zum Beispiel lokale Namen/Namensräume. Und Funktionen/Prozeduren wären auch nicht schlecht.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

BlackJack hat geschrieben:Ich hatte da auch immer mal vor so etwas für Variablennamen zu machen. Also das lange zu kurzen gemacht werden. Entweder welche die man selber festlegt, beziehungsweise wenn man das nicht machen möchte, dann einfach generierte kurze Namen.
Das Zusammenkürzen wäre auch eine Idee. Ich dachte ehr an einer Fehlermeldung.

Denke das erste was ich irgendwann mal angehen werde, wäre ein simples CLI skript was ein RENUM macht.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich würde das gern mal angehen.
BlackJack hat geschrieben:@jens: Für Zeilennummern habe ich mir einen ganz einfachen Präprozessor geschrieben der Programme ohne Zeilennummern mit Labels in welche mit Zeilennummern übersetzt.
Feindes du den code noch?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

@jens: Ich sag dann mal nein und tue so als wenn ich nur noch die *.pyc-Datei habe. Ernsthaft: Der Quelltext ist ganz furchtbar, den mag ich nicht zeigen. :-)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also der Grundstein ist nun gelegt.

Den Editor ist im https://github.com/jedie/DragonPy Projekt. Aber er ist auch einzeln benutzbar.
Der Code ist hier: https://github.com/jedie/DragonPy/blob/ ... /editor.py (Einfach diese Datei starten)

Noch gibt es wenig hilfreiche Funktionen. Mit https://github.com/jedie/DragonPy/commi ... c6233c370a gibt es erstmal eine wichtig Funktion für mich: "RENUM", also das neu nummerieren des BASIC Listings.

Der code zum eigentlichen neu Numerieren steckt in "dragonlib".
An der Stelle: https://github.com/jedie/DragonPy/blob/ ... ic.py#L204

Im Grunde sind es zwei regular expressions:
1. "(?P<no>\d+)(?P<code>.+)"
2. "(?P<statement> GOTO|GOSUB|THEN|ELSE ) (?P<space>\s*) (?P<no>\d+)"

Das ganze läuft in zwei Phasen:
1. dict erstellen, mit alter -> neuer Zeilennummer
2. Alle Zeilennummern ersetzten

Keine Ahnung ob ich alle Fälle wirklich abdecke. Was auf jeden Fall "falsch" gemacht wird: Es werden keine Kommentare oder String ausgelassen. Also hier würde auch neue Nummern gesetzt:

Code: Alles auswählen

10 ' GOTO 10 im Kommentar
20 PRINT "GOTO 20 im String"
Kann man sicherlich auch recht einfach Lösen, aber wozu die Mühe?

Was als nächstes Nett wäre: VARIABLEN hervorheben. Am besten halt nur die wichtigen ersten zwei Buchstaben. Und Hinweisen, wenn die sich überschneiden, bsp:
10 VAR_A = 1
20 VAR_B = 2

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

@jens: Kennt das Basic auch ``ON x GOTO 42,23,4711`` beziehungsweise ``ON x GOSUB 42,23,4711``?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Stimmt, die beiden gibt es auch noch!

Danke für den Hinweis :-)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

BlackJack hat geschrieben:@jens: Kennt das Basic auch ``ON x GOTO 42,23,4711`` beziehungsweise ``ON x GOSUB 42,23,4711``?
Das geht nun auch mit https://github.com/jedie/DragonPy/commi ... 1d855b9e97

Aber die Lösung finde ich mehr suboptimal. Mir viel nichts besseres ein.

Ich hätte natürlich statt der zwei regex:

Code: Alles auswählen

        (?P<statement> GOTO|GOSUB|THEN|ELSE ) (?P<space>\s*) (?P<no>\d+)
        |
        (?P<on_goto_statement> ON.+?GOTO|ON.+?GOSUB ) (?P<on_goto_space>\s*) (?P<on_goto_no>[\d*,\s*]+)
nur eine allgemeinere machen können:

Code: Alles auswählen

        (?P<statement> GOTO|GOSUB|THEN|ELSE ) (?P<space>\s*) (?P<no>[\d*,\s*]+)
Würde wahrscheinlich in der Praxis nicht viel ändern. Aber es wird nicht explizit auf "ON..." getestet... :?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

So, nach den heutigen commits: https://github.com/jedie/DragonPy/compa ... ...ce12148 funktioniert nun das senden/empfangen vom BASIC Listign von Editor<->Emulator richtig.

Sieht dann so aus:
Bild

Wer mal testen will:
~$ git clone https://github.com/jedie/DragonPy.git

# Oder .zip laden: https://github.com/jedie/DragonPy/archive/master.zip

~$ cd DragonPy

# Download ROM files:
~$ ./download_ROMs.sh

# start Dragon 32 ROM:
~$ python2 ./Dragon32_test.py

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Es gibt ein bisschen was neues:

Bild

Neben dem Aussehen, gibt es nun eine einfaches Syntax highlighting :D
Dazu wird auch die BASIC Zeilennummern extra hervorgehoben, die man als Sprungziel auch benutzt.

Momentan wird nur mit dem einfachen BASIC parser (siehe: http://www.python-forum.de/viewtopic.ph ... 51#p262951 ) zwischen Code, DATA, Strings und Commentaren unterschieden. Und nur diese Unterscheidung wird verschieden eingefärbt.

So richtig schön wird es natürlich erst, wenn der Code noch weiter Aufgebröselt wird...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten