Hier ist ein Compiler für eine exotische Sprache: "Hackish".
Generiert Java-Bytecode (bzw. Java Assembly, die dann mit Jasmin in Java Bytecode übersetzt wird). Benutztes Framework: SableCC. Lizenz: LGPL
Habe mich zu meiner Zeit damit rumgeärgert - SableCC ist zwar von der Theorie schön (OO, automatische AST und AST-Treewalker Generierung, gute LARL Grammatik) und wird auch im Drachenbuch aufgeführt- aber anderseits hier und da sehr sperrig und wirklich große Beispiele (also zusammenhängende - Interpreter/Compiler und nicht bloß Beispielgrammatiken) findet man dafür nicht wirklich. Die Beispiele im Internet oder Drachenbuch helfen jedenfalls nicht wirklich bei den vielen kleinen Problemen (wie z.B Ausgabe der Fehlerstelle, wenn man im AST rumwuselt), die unvermeidbar auftreten. JavaCC fand ich um Längen angenehmer.
Vielleicht erspart das einigen den unnötigen Stress.
Habe zwar die benötigten Jars beigelegt (sablecc,jasmin) aber nicht deren Sourcecode - diesen kann man bei bedarf auf der jeweiligen Homepage finden (siehe Links):
http://www.lrr.in.tum.de/~jasmin/downloads.html
http://sablecc.org/wiki/DownloadPage
Für den hypothetischen Fall, dass sich einer der Beispielcodeautoren an der Freigabe der 4 Zeiler stört - einfach melden.
Kurz zu Source.zip:
hackish.sablecc ist die Grammatikdatei
build.xml ist ein ANT-Make Skript. Wer Eclipse nutzt, sollte eigentlich schon das Ant Plugin haben - sonst kann man es auch nachladen. Das ganze kann auch ohne Ant compiliert werden - dafür muss man dann aber Hand anlegen (siehe Readme).
Unter src\de\stups\matrikelnummer\generated\ befinden sich die von SableCC generierten Klassen. Bei Anpassungen sollte man immer eine eigene Klasse ableiten und nicht die generierte ändern, weil sonst die Änderungen beim nächsten Mal überschrieben werden.
Falls jemand wirklich an der Sprache interessiert sein sollte:
in compiler_und_beispiele.zip
ist die Java-Binary + Beispiele der Sprache.
Die Sprache an sich ist stellenweise an Haskell angelehnt und unterstützt Indentations - man kann also den Codeflüss durch Einrückungen gestalten
Es gibt nur globale Variablen und Dank der zu unterstützenden Gotos keine Rekursion. Eigene Funktionen können keine Parameter haben. Datentypen: Int,Bool,String.
In einem Modul werden zuerst Variable/Anweisungsblöcke deklariert und erst innerhalb der Blockdeklarationen können Anweisungen stehen. Alle Klammer(auch Parameter) sind otional und die Syntax recht freizügig in der Gestaltung (viele Sachen können unterschiedlich geschrieben werden - z.B Repeat/Whileschleifen oder Funktionsaufrufe. Allerdings muss jede Anweisung mit einem ; enden (es sei denn, man nutzt Intendtations oder es ist die letzte Anweisung im Block) - auch nach einer geschweiften Klammer: do {blub};
Den Beispielen kann man eigentlich alles weitere entnehmen (und wer es nicht glaubt - man kann sogar den kompletten Compiler nur auf Basis von Beispielen schreiben
)
Compilierung:
java -jar hackishCompiler.jar Name.hs
Aufruf mit
java Name
wobei die IRTS.class und RTS.class das "Runtimesystem" bilden und im selben Ordner liegen sollten, wie die generierte Class Datei.
Generiert Java-Bytecode (bzw. Java Assembly, die dann mit Jasmin in Java Bytecode übersetzt wird). Benutztes Framework: SableCC. Lizenz: LGPL
Habe mich zu meiner Zeit damit rumgeärgert - SableCC ist zwar von der Theorie schön (OO, automatische AST und AST-Treewalker Generierung, gute LARL Grammatik) und wird auch im Drachenbuch aufgeführt- aber anderseits hier und da sehr sperrig und wirklich große Beispiele (also zusammenhängende - Interpreter/Compiler und nicht bloß Beispielgrammatiken) findet man dafür nicht wirklich. Die Beispiele im Internet oder Drachenbuch helfen jedenfalls nicht wirklich bei den vielen kleinen Problemen (wie z.B Ausgabe der Fehlerstelle, wenn man im AST rumwuselt), die unvermeidbar auftreten. JavaCC fand ich um Längen angenehmer.
Vielleicht erspart das einigen den unnötigen Stress.
Habe zwar die benötigten Jars beigelegt (sablecc,jasmin) aber nicht deren Sourcecode - diesen kann man bei bedarf auf der jeweiligen Homepage finden (siehe Links):
http://www.lrr.in.tum.de/~jasmin/downloads.html
http://sablecc.org/wiki/DownloadPage
Für den hypothetischen Fall, dass sich einer der Beispielcodeautoren an der Freigabe der 4 Zeiler stört - einfach melden.
Kurz zu Source.zip:
hackish.sablecc ist die Grammatikdatei
build.xml ist ein ANT-Make Skript. Wer Eclipse nutzt, sollte eigentlich schon das Ant Plugin haben - sonst kann man es auch nachladen. Das ganze kann auch ohne Ant compiliert werden - dafür muss man dann aber Hand anlegen (siehe Readme).
Unter src\de\stups\matrikelnummer\generated\ befinden sich die von SableCC generierten Klassen. Bei Anpassungen sollte man immer eine eigene Klasse ableiten und nicht die generierte ändern, weil sonst die Änderungen beim nächsten Mal überschrieben werden.
Falls jemand wirklich an der Sprache interessiert sein sollte:
in compiler_und_beispiele.zip
ist die Java-Binary + Beispiele der Sprache.
Die Sprache an sich ist stellenweise an Haskell angelehnt und unterstützt Indentations - man kann also den Codeflüss durch Einrückungen gestalten
Code:
entry = do
repeatUntil $$
do
rom=:""
writeLn("Zahl zum Umrechnen oder 0 zum aufhören:");
getInt dez
ifThen(dez==0) $$
exit 0
umrechnen
writeLn(rom)
$$(false)
In einem Modul werden zuerst Variable/Anweisungsblöcke deklariert und erst innerhalb der Blockdeklarationen können Anweisungen stehen. Alle Klammer(auch Parameter) sind otional und die Syntax recht freizügig in der Gestaltung (viele Sachen können unterschiedlich geschrieben werden - z.B Repeat/Whileschleifen oder Funktionsaufrufe. Allerdings muss jede Anweisung mit einem ; enden (es sei denn, man nutzt Intendtations oder es ist die letzte Anweisung im Block) - auch nach einer geschweiften Klammer: do {blub};
Den Beispielen kann man eigentlich alles weitere entnehmen (und wer es nicht glaubt - man kann sogar den kompletten Compiler nur auf Basis von Beispielen schreiben

Compilierung:
java -jar hackishCompiler.jar Name.hs
Aufruf mit
java Name
wobei die IRTS.class und RTS.class das "Runtimesystem" bilden und im selben Ordner liegen sollten, wie die generierte Class Datei.