2010-02-04 18 views
18

Pracuję nad całkiem skomplikowanym DSL, który chcę skompilować w kilku językach wysokiego poziomu. Cały proces był doświadczeniem uczenia się. Kompilator jest napisany w języku Java.Najlepszy projekt do generowania kodu z AST?

Zastanawiam się, czy ktoś zna najlepszą praktykę projektowania części generatora kodu. Obecnie wszystko jest przetwarzane na abstrakcyjne drzewo składniowe.

Myślałem o używaniu systemu szablonów, ale nie badałem tego kierunku zbyt daleko, ponieważ chciałbym usłyszeć pewną mądrość jako pierwszą z przepełnienia stosu.

Dzięki!

+1

Może to tylko dlatego, że zapytałeś o to dawno temu. Ale na dzień dzisiejszy (2013) ANTLR (który wydaje się być używany) ma wbudowane szablony ciągów. –

Odpowiedz

8

Kiedy robiłem to z powrotem w mojej klasie języków programowania, skończyliśmy używać emiterów opartych na wzorcu Visitor. To działało całkiem dobrze - sprawia, że ​​ponowne kierowanie go na nowe języki wyjściowe jest całkiem łatwe, o ile twój AST pasuje do tego, co drukujesz całkiem dobrze.

+0

Dzięki za pomysł. Znam wzorzec Odwiedzającego. Używam go do optymalizacji dosłownych wyrażeń w drzewie. –

+0

Nie twierdząc, że nie jesteś zaznajomiony z tym, sugerując, że może się to skończyć, tworząc dobry generator kodu :-) –

+0

Tak, nie chciałem, żeby brzmiał zadowolony z siebie. Rozglądam się teraz, dzięki. :) –

-1

DSL to miła rzecz. Pisanie ich to dobra praktyka.

Ale nie jestem pewien, czy wdrożenie własnego YACC i podobnych jest dobrym wyborem w 2010 roku, chyba że jest to tylko zabawa lub edukacja.

Kiedy zakończysz proces edukacyjny i zaczniesz szukać przyjemnego sposobu implementacji DSL, możesz rozważyć użycie dynamicznych języków.

Na przykład za pomocą Groovy można zaimplementować swoje małe i duże DSL bardzo łatwo i przyjemnie.
BTW Groovy ma wbudowany interfejs manipulacji AST.

+0

Myślę, że mogłeś źle zrozumieć. Używam generatora analizatora składni już do generowania AST. Używam ANTLR3 i buduję drzewo. Szukam najlepszego sposobu, aby z powrotem to drzewo z powrotem do kodu w innym języku wysokiego poziomu. Dzięki. –

6

To, czego naprawdę chcesz, to program transformation system, które odwzorowuje struktury składni w jednym języku (twoje DSL) na wzorce składni w innych językach. Takie narzędzie może przeprowadzać dowolne transformacje (przepisywanie drzew generalizują napisy, które są systemami Post, które są w pełni Turinga) podczas projektu generowania kodu, co oznacza, że ​​to, co generujesz i jak wyrafinowany proces generowania jest określony tylko twoją ambicją , a nie przez właściwości "generatora kodu".

Zaawansowane systemy transformacji programów łączą różne typy analizy zakresu, analizy przepływu i/lub niestandardowe analizatory, aby umożliwić transformacje. Nie dodaje to żadnej teoretycznej mocy, ale dodaje wiele praktycznej mocy: większość rzeczywistych języków (nawet DSL) ma przestrzenie nazw, sterowanie i przepływ danych, potrzebne wnioskowanie typu itp. Itp.

Nasz DMS Software Reengineering Toolkit jest tym typem systemu transformacji. Został wykorzystany do analizy/transformacji zarówno języków konwencjonalnych, jak i DSL, dla prostych i złożonych języków oraz dla małych, dużych, a nawet ogromnych systemów oprogramowania.

Związane z komentarzami OP o numerach "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 (zaimplementowanymi przy użyciu języków docelowych w języku docelowym). Wynikowy język docelowy AST jest następnie automatycznie drukowany przez DMS w celu zapewnienia rzeczywistego kodu źródłowego w języku docelowym, który odpowiada docelowemu AST.

3

Jeśli już używasz ANTLR AST i mieć gotowy warto przyjrzeć StringTemplate: http://www.antlr.org/wiki/display/ST/StringTemplate+Documentation

także sekcja 9.6 The Definitive ANTLR referencyjnego: Budowa specyficzne dla domeny języków wyjaśnia następująco: http://www.pragprog.com/titles/tpantlr/the-definitive-antlr-reference

Darmowe próbki kodu są dostępne w http://media.pragprog.com/titles/tpantlr/code/tpantlr-code.tgz. W kodzie podfolderów \ templates \ generator \ 2pass \ znajdziesz przykład konwertujący wyrażenia matematyczne na bajt kodu Java.

Powiązane problemy