2011-10-25 24 views
23

Chcę być w stanie wykonać generowanie kodu Pythona z opisem AST.Generator kodu Pythona

Przeprowadziłem statyczną analizę C i zbudowałem odwiedzających AST w pythonie, więc czuję się względnie wygodnie manipulując drzewem składni, ale nigdy wcześniej nie próbowałem generować kodu i próbuję określić najlepszą praktykę do generowania kodu Pythona .

W szczególności chciałbym wskazać, w jaki sposób zwykle wykonuje się automatyczne generowanie kodu, lub dowolne wskazówki do bibliotek kierujących do Pythona, które mogłyby uprościć to zadanie.

Moim końcowym celem jest próba wykonania czegoś podobnego do csmith lub narzędzia do uczynienia kodu Pythona zgodnym z PEP8.

+0

Czy używasz niestandardowego AST, czy też tworzysz Pythona AST (używając np. Modułu 'ast')? –

+0

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

Odpowiedz

16

Możesz rzucić okiem na narzędzie 2to3, opracowane przez programistów kodu Python, aby automatycznie przekonwertować kod Python 2 na kod Python 3. Narzędzie najpierw analizuje kod do drzewa, a następnie wypycha "naprawiony" kod Pythona 3 z tego drzewa.

To może być dobre miejsce, aby rozpocząć, ponieważ jest to "oficjalne" narzędzie Python zatwierdzone przez głównych programistów i część zalecanej ścieżki migracji Pythona 2 do 3.

Można również sprawdzić kod codegen.py module, który generuje kod Python z powrotem z Pythona ast.

Zobacz także tym SO question, które mogą być istotne dla twoich (nie jestem oznakowanie to duplikat, bo nie jestem pewien zakresy pytań pokrywają 100%)

4

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.