BASIC Lexer/Tokenizer in Python?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Kennt jemand einen schön und einfach implementierten Lexer/Tokenizer für BASIC artige Sprachen?

Was ich bisher gefunden habe:
http://docs.python.org/3/library/re.htm ... -tokenizer
http://www.jayconrod.com/posts/37/a-sim ... hon-part-1

Worum es mir eigentlich geht, ist BASIC code mit den token zu tauschen: https://github.com/jedie/PyDragon32/blo ... _tokens.py

Also aus 10 PRINT "Foo PRINT Bar" soll [10, " ", 0x87, '"Foo PRINT Bar"'] werden.
Denke eigentlich brauche ich keinen richtigen Lexer/Tokenizer sondern könnte mit ein bischen RegularExpressions ganz gut hin kommen. Etwas richtiges zu haben, kann aber auch nicht schaden. Wenn es nicht zu Aufwendig wird.

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

@jens: Ich habe so etwas für CBM BASIC V2 geschrieben. Sollte ich vielleicht mal veröffentlichen. Denn das grundsätzliche Format ist ja sehr ähnlich zu dem was Du brauchst.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Zudem es anscheinend keine kompliziertes Quoting/DoubleQuotes gibt... Also nicht sowas:

Code: Alles auswählen

print 'foo " bar'
print "foo ' bar"
print "foo \" bar"
print """foo " bar"""
So wie es aussieht gibt es nur einfache Gänsefüßchen :wink:

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

@jens: Wo man aufpassen muss ist, dass (zumindest bei CBM BASIC) einiges möglich ist, was nicht unbedingt im Handbuch steht, aber funktioniert und auch genutzt wird/wurde. Zum Beispiel das ein Zeilenende ein schliessendes " ersetzen kann. Spart ein Byte ein.

Und interessant fand ich auch die Frage ob nach einem REM (oder ') die Zeichen 1:1 in den Speicher übernommen werden, oder ob da auch Tokens erkannt und verwendet werden. Das war auf dem C64 auch von praktischem Interesse weil dort BASIC-Compiler in der Regel Anweisungen für den Compiler in den Kommentaren ermöglichen. Die geiche Frage Tokenisieren oder nicht, stellt sich auch bei ``DATA``, denn Zeichenketten müssen dort überhaupt nicht in Anführungszeichen gesetzt werden. Also ``data "eins","zwei","drei"`` kann man auch als ``data eins,zwei,drei`` schreiben.
BlackJack

@jens: Das hier hatte ich mal für den Eigenbedarf verbrochen: http://pastebin.com/kx9dgjvK

Dokumentation/Kommentare wären an der einen oder anderen Stelle wahrscheinlich nicht schlecht.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab was gefunden: http://www.gripho.it/py_basic.tgz

Ist ein kompletter BASIC Interpreter in Python.

Ist von http://www.gripho.it/homepage.en.html

Leider ist nirgends eine Lizenz des Codes zu finden. Ich werde dem Autor mal eine Mail schreiben.

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