2010-02-04 7 views
18

Ich arbeite an einem ziemlich komplexen DSL, das ich in ein paar Hochsprachen kompilieren möchte. Der ganze Prozess war eine Lernerfahrung. Der Compiler ist in Java geschrieben.Bestes Design zum Generieren von Code von einem AST?

Ich fragte mich, ob jemand eine Best Practice für das Design des Code-Generator-Teils wusste. Ich habe derzeit alles in einen abstrakten Syntaxbaum geparst.

Ich dachte daran, ein Template-System zu verwenden, aber ich habe diese Richtung noch nicht zu weit erforscht, da ich erst von Stapelüberlauf etwas Weisheit hören möchte.

Danke!

+1

Vielleicht ist es nur, weil Sie das vor langer Zeit gefragt haben. Aber ab heute (2013) hat ANTLR (das Sie zu verwenden scheinen) "String-Vorlagen" eingebaut. –

Antwort

8

Als ich das wieder in meiner Programmiersprachen-Klasse machte, verwendeten wir Emitter, die auf dem Muster Visitor folgten. Es funktionierte ziemlich gut - es macht es ziemlich einfach, es auf neue Ausgabesprachen umzugestalten, solange Ihr AST dem entspricht, was Sie ziemlich gut drucken.

+0

Danke für die Idee. Ich kenne das Besuchermuster. Ich benutze es, um literale Ausdrücke in der Struktur zu optimieren. –

+0

Ich behaupte nicht, dass Sie damit nicht vertraut sind, ich schlage nur vor, dass es am Ende auch einen guten Code-Generator ergeben könnte :-) –

+0

Ja, das wollte ich nicht so klingen, dass es selbstgefällig klingt. Ich schaue gerade nach, danke. :) –

-1

DSL ist eine nette Sache. Und sie zu schreiben ist eine gute Übung.

Aber ich bin mir nicht sicher, ob die Implementierung Ihrer eigenen YACC und ähnliche 2010 eine gute Wahl ist, es sei denn, es ist nur zum Spaß oder Bildung.

Wenn Sie Ihren Lernprozess abgeschlossen haben und nach einer guten Möglichkeit suchen, Ihre DSLs zu implementieren, können Sie dynamische Sprachen verwenden.

Durch die Verwendung von Groovy zum Beispiel können Sie Ihre kleinen und großen DSLs sehr einfach und auf unterhaltsame Weise implementieren.
BTW Groovy hat in AST Manipulation API gebaut.

+0

Ich denke, Sie haben vielleicht missverstanden. Ich verwende bereits einen Parser-Generator, um den AST zu generieren. Ich benutze ANTLR3 und lasse den Baum bauen. Ich bin auf der Suche nach dem besten Weg, diesen Baum in einer anderen Hochsprache wieder in Code umzuwandeln. Vielen Dank. –

6

Was Sie wirklich wollen, ist eine program transformation system, die Syntaxstrukturen in einer Sprache (Ihre DSL) in Syntaxmuster in anderen Sprachen abbildet. Solch ein Tool kann während des Codegenerierungsprojekts beliebige Transformationen (Baumumschreibungen Generieren von String-Umschreibungen, bei denen es sich um vollständige Turing-fähige Post-Systeme handelt) ausführen, was bedeutet, dass Ihr Erzeugungsprozess und wie ausgefeilt Ihr Generierungsprozess nur von Ihrem Ehrgeiz bestimmt wird nicht durch "code generator framework" -Eigenschaften.

Sophtisticated Programm Transformation Systeme kombinieren verschiedene Arten von Scoping, Flow-Analyse und/oder benutzerdefinierte Analysatoren, um die Transformationen zu ermöglichen. Dies bringt keine theoretische Macht, aber es fügt eine Menge praktische Macht hinzu: die meisten realen Sprachen (sogar DSLs) haben Namespaces, Steuerung und Datenfluss, benötigen Typschluss usw. usw.

Unser DMS Software Reengineering Toolkit ist dieser Typ des Transformationssystems. Es wurde verwendet, um sowohl konventionelle Sprachen als auch DSLs zu analysieren/zu transformieren, für einfache und komplexe Sprachen und für kleine, große und sogar große Softwaresysteme.

In Bezug auf Kommentare von OP über "turning the AST into other languages", that is accomplished by DMS by writing transformations that map surface syntax for the DSL (implemented behind the scenes his DSL's AST) to surface syntax for the target language (implementiert mit Zielsprache ASTs). Die resultierende Zielsprache AST wird dann von DMS automatisch pretty printed, um tatsächlichen Quellcode in der Zielsprache zu liefern, der dem Ziel-AST entspricht.

3

Wenn Sie bereits mit ANTLR und haben Ihren AST bereit, Sie vielleicht einen Blick auf String nehmen wollen: http://www.antlr.org/wiki/display/ST/StringTemplate+Documentation

auch Abschnitt 9.6 von The Definitive ANTLR Referenz: Gebäude Domain-Specific Languages ​​ erklärt dies: http://www.pragprog.com/titles/tpantlr/the-definitive-antlr-reference

Die freien Code-Beispiele bei http://media.pragprog.com/titles/tpantlr/code/tpantlr-code.tgz zur Verfügung stehen. Im Unterordner code \ templates \ generator \ 2pass \ finden Sie ein Beispiel, in dem mathematische Ausdrücke in Java-Bytecode konvertiert werden.