Frage zu ''exec''

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Und wie realisert man (in verständlichen worten ;)) ein AST? Gibt es darüber gute Literatur die man auch versteht wenn man nicht gerade Studiert hat und was nicht zu Akademisch in den Formulierungen klingt?

lg
BlackJack

Also eines der Standardwerke in dem Bereich ist das "Dragon Book", so benannt wegen des Bildes auf dem Umschlag, von dem dieses Jahr gerade eine aktualisierte Auflage herausgekommen ist. Korrekter Titel ist "Compilers -- Principles, Techniques, and Tools" von Aho, Alfred V. / Lam, Monica S. / Ullman, Jeffrey D.

Ist zwar Fachliteratur, aber bei englischer Fachliteratur legen die Autoren meistens Wert auf Verständlichkeit. Bei deutschen Autoren habe ich manchmal das Gefühl die wollen damit angeben, dass sie etwas möglichst knapp, formal und schwerverständlich formulieren können. :-)

Das Buch ist aber sehr umfangreich und nicht gerade billig. Lohnt sich wahrscheinlich nicht wenn man nicht wirklich einen Compiler schreiben möchte oder Informatik studiert.

Grundsätzlich bekommt man einen AST aus einem Stück Quelltext indem man es "parst". Dazu braucht man eine Grammatik, welche die Sprache beschreibt und einen Parser der diese Grammatik erkennt. Der kann dann aus einem Quelltext einen AST aufbauen.

Das Thema ist dann aber ein bisschen zu komplex um es mal eben hier zu erklären würde ich sagen. Einfacher wird es, wenn man einen Parser-Generator benutzt, dem man eine Grammatik gibt und der entsprechenden Code generiert um Quelltext nach dieser Grammatik zu parsen. Bei Python finde ich `PyParsing` am nettesten, da baut man die Grammatik aus Objekten zusammen. `yapps2` erzeugt für Menschen "lesbaren" Quelltext, erkennt aber nur eine bestimmte Klasse von Sprachen. Für C hat mir `lemon` bisher am besten gefallen.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Oh, ok. Englisch ist nicht so mein Ding ;)
Ein Deutsches Buch sollte es schon sein, das aber halt nicht so kompliziert Formuliert ist und halt auch ein normaler Mensch verstehen kann, ohne Professor zu sein :) Ich sehe das auch so das viele Deutsch bücher so Klingen so wie du es meintest.

Aber mal ne Frage Jack: Das hier wäre ein sehr schlechter Ansatz oder?:

http://paste.pocoo.org/show/306/

Sorry, der Code ist ncoh __sehr__ Suboptimal und vieles könnte man auch ohne diese vielen Verzweigungen schon vorher behandeln. Ist eben sehr """schnell""" geschrieben von mir (hab ca. 1,5-2 Stunden gestern daran gesessen. EDIT: Wusste seit gestern noch nicht wie man regExe mit Python _richtig_ benutzt. Nun weiß ichs :)). Auch denke ich das hierfür regExe wohl nicht so sinnvoll ist und man lieber mit Stacks arbeiten sollte? -> http://www.rg16.asn-wien.ac.at/~python/ ... /kap18.htm

Aber mit AST verstehe ich noch nicht ganz worum es geht. Soll man aus die Tokens auf Objekte abbilden (so ne art Verzweigung von Objekten)? Ist doch nicht sinnvoll oder? Dann doch lieber alles parsen und dann den Code erzeugen der dann ausgeführt wird :?

lg
BlackJack

XtraNine hat geschrieben:Aber mal ne Frage Jack: Das hier wäre ein sehr schlechter Ansatz oder?:

http://paste.pocoo.org/show/306/
Naja, wie Du selbst geschrieben hast, sind die regulären Ausdrücke hier ein bisschen übertrieben. Das bekäme man mit `str.split()` und anderen Methoden auf Zeichenketten auch hin.
Auch denke ich das hierfür regExe wohl nicht so sinnvoll ist und man lieber mit Stacks arbeiten sollte? -> http://www.rg16.asn-wien.ac.at/~python/ ... /kap18.htm

Aber mit AST verstehe ich noch nicht ganz worum es geht. Soll man aus die Tokens auf Objekte abbilden (so ne art Verzweigung von Objekten)? Ist doch nicht sinnvoll oder?
Bei dem Beispiel auf der Webseite mit dem Stack braucht man natürlich keinen AST, die Postfix-Notation hat ja gerade die nette Eigenschaft, dass man das mit dem Stack einfach von links nach rechts auswerten kann. So einfach sind die meisten Sprachen leider nicht.
Dann doch lieber alles parsen und dann den Code erzeugen der dann ausgeführt wird :?
Das Ergebnis vom parsen ist in den meisten Fällen ein AST, aus dem dann der Zielcode erzeugt wird. Oder wie in dem Beispiel von blackbird gibt's auf den Knoten im AST Methoden die das Programm ausführen. Soweit ich weiss wird bei Ruby auch der AST "ausgeführt". CPython erzeugt aus dem AST nach dem parsen Bytecode für eine virtuelle Maschine.
Antworten