Automatyczne generowanie kodu jest powszechnie wykonywane w z następujących sposobów:
- wydruku sprawozdania zawierające fragmenty kodu
- szablonów tekstowych zastępcze (makra think)
IMHO, lepiej jest praktyka:
- Wbudowany AST dla fragmentu docelowego, a następnie prettyprint
mało kto robi te ostatnie, ponieważ narzędzia są w większości nie istnieje.
Narzędzie 2to3 Pythona zapewnia (moim zdaniem) docelową AST i ładne drukowanie.
Ale pytanie, o które nie zapytałeś, to "generowanie z czego?" W jakiś sposób musisz określić abstrakcyjnie, co chcesz wygenerować (lub nie jest wygrana). A twoje narzędzie musi w jakiś sposób odczytać tę specyfikację.
Wiele schematów generowania kodu składa się z pisania kodu proceduralnego, który wywołuje powyższe mechanizmy generowania; kod proceduralny działa jako domyślna specyfikacja. "Łatwo" przeczytać specyfikację; jest to po prostu kod w języku używanym przez generator kodu.
Niektóre schematy generowania kodu wykorzystują pewien rodzaj struktury wykresu, aby zapewnić ramkę, na której zawiesza się fragmenty specyfikacji, które generują kod. Diagramy klas UML są klasycznym przykładem. Te schematy nie są tak łatwe; potrzebujesz "czytnika specyfikacji" (np., Czytnik diagramów UML, inaczej XMI lub niektóre z nich, lub jeśli nie korzystasz z UML, jakiś rodzaj parser specyfikacji).
Narzędzie Python 2to3 używa parsera Python2 do odczytu "spec". Jeśli chcesz wygenerować kod z Python2, będzie dobrze. Podejrzewam, że nie chcesz tego robić.
Podejście oparte na najlepszych praktykach to takie, które ujednolica zdolność do odczytu/analizy/przechodzenia specyfikacji, z możliwością tworzenia AST dla języka docelowego.
Nasz DMS Software Reengineering Toolkit jest ogólnym programem do analizy i transformacji programów. Analizuje "specyfikacje" (instancje gramatyki, które możesz zdefiniować) w ASTs; Pozwoli ci to także zbudować dowolne AST dla każdej z tych gramatyk, używając albo kodu proceduralnego [jak pokazano na szkicu], albo używając dopasowywania wzorców/wymiany (w zasadzie unikalnego dla DMS). Część przedniego końca DMS jest ładnym wskaźnikiem, który może zregenerować tekst od AST (są one testowane za pomocą kodu roundtripping: parsowanie do AST, ładny odcisk AST, lepiej być tym samym tekstem).
W przypadku, gdy gramatyka nie jest znana DMS, ma bardzo dobre generatory analizatora i prettyprintera, a także inne mechanizmy wsparcia dla analizowania programów. Wszystkie te dodatkowe maszyny zwykle nie są dostępne w klasycznych generatorach parsera lub po prostu zwykłym pakiecie "AST". (Nie wiem, co to jest 2to3).
Znaczenie tego dla Pythona polega na tym, że DMS ma Python front end, a także grammars for many other languages.
Można więc przeanalizować specyfikację i wygenerować kod w języku Python przy użyciu funkcji AST, a następnie ładnego drukowania.
Czy używasz niestandardowego AST, czy też tworzysz Pythona AST (używając np. Modułu 'ast')? –
Najprawdopodobniej Python AST, używając modułu 'ast'. Zauważyłem, że ANTLR jest przeznaczony do pisania pythonów i wydaje się, że jest to możliwy sposób, ale rozsądniej jest trzymać się Pythona. – mvanveen