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
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
Editor für BASIC programme mit netten Features...
@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.
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.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Das Zusammenkürzen wäre auch eine Idee. Ich dachte ehr an einer Fehlermeldung.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.
Denke das erste was ich irgendwann mal angehen werde, wäre ein simples CLI skript was ein RENUM macht.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Ich würde das gern mal angehen.
Feindes du den code noch?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.
@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.
- 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:
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:
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"
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
@jens: Kennt das Basic auch ``ON x GOTO 42,23,4711`` beziehungsweise ``ON x GOSUB 42,23,4711``?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Das geht nun auch mit https://github.com/jedie/DragonPy/commi ... 1d855b9e97BlackJack hat geschrieben:@jens: Kennt das Basic auch ``ON x GOTO 42,23,4711`` beziehungsweise ``ON x GOSUB 42,23,4711``?
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*]+)
Code: Alles auswählen
(?P<statement> GOTO|GOSUB|THEN|ELSE ) (?P<space>\s*) (?P<no>[\d*,\s*]+)
- 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:
Wer mal testen will:
Sieht dann so aus:
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
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Es gibt ein bisschen was neues:
Neben dem Aussehen, gibt es nun eine einfaches Syntax highlighting
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...
Neben dem Aussehen, gibt es nun eine einfaches Syntax highlighting
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...