2009-12-23 4 views
10

Ich erstelle einen Baum, um eine einfache Sprache darzustellen. Ich bin mit Abstract Syntax Trees sehr vertraut und habe an Frameworks gearbeitet, um sie in C++ zu erstellen und zu verwenden. Gibt es eine Standard-Python-Bibliothek zum Angeben oder Manipulieren beliebiger ASTs? Fehlt das, gibt es eine Baumbibliothek, die für den gleichen Zweck nützlich ist?Bibliothek für die Programmierung abstrakter Syntaxbäume in Python

Hinweis, ich manipuliere nicht Python ASTs, so denke ich, das AST-Modul ist nicht geeignet.

Antwort

7

ASTs sind in Python sehr einfach zu implementieren. Für mein Projekt pycparser (ein vollständiger C-Parser in Python) habe ich zum Beispiel ASTs implementiert, die auf Ideen basieren, die aus Pythons Modulen stammen. Die verschiedenen AST-Knoten sind in einer YAML-Konfigurationsdatei angegeben, und ich erstelle Python-Code für diese Knoten in Python selbst.

+0

ganz nett. ich hatte schon etwas gehofft, gut in eine Bibliothek abstrahiert, mit Dokumentation, usw. (keine Beleidigung). Meine Grammatik hat nur 6 Typen, so Es ist relativ einfach, es zu schreiben Ich selbst. Ich dachte nur, es könnte eine Standardbibliothek geben, die Leute benutzen. –

+0

@Paul, wenn Sie darüber nachdenken, ist der beste Weg, eine AST zu verwenden, die Definition einer Klasse für jeden Knotentyp. Dies ist die polymorphste und sauberste Art, den Baum später zu durchlaufen (mit einem NodeVisitor). Daher müssen Sie diese Klassen trotzdem schreiben. Wenn man bedenkt, wie wenig Code ein AST in Python benötigt, bezweifle ich, dass hier eine Bibliothek benötigt wird. –

+0

@AndersonGreen: danke, habe den Hauptlink aktualisiert und andere entfernt –

0

Wenn Sie Ihre Grammatikelemente als Ausdrücke in Pyparsparent darstellen, können Sie jedem Ausdruck eine Analyseaktion zuordnen, die eine Klasseninstanz zurückgibt, die die analysierten Tokens in einem parserspezifischen Typ enthält. Es gibt ein paar Beispiele auf dem pyparsing Wiki, die diese Technik veranschaulichen (, simpleBool.py und evalArith.py). (Diese Grammatiken alle operatorPrecedence verwenden eingebaut, die einen Teil der Grammatik Struktur verschleiern kann, aber

1

pyast ist ein Paket für deklarative abstrakte Syntaxbäume zu bauen.

Verwandte Themen