Smython - ein Python 3.x-Parser in Java
Verfasst: Dienstag 14. April 2009, 10:20
In einem anderen Thread fabulierte ich über die Google App Engine für Java und die Möglichkeit, darüber Scriptsprachen auszuführen.
In den letzten Tagen habe ich einen Parser für Python 3.x in Java geschrieben. Er versteht z.B. `[a + 1 for a in b if 2 if 3]` oder `c(a+1 for a in b for c in d)`, auch wenn ich noch eine Reihe von Fehlern beseitigen muss. Der Parser erzeugt einen AST, den man dann im nächsten Schritt interpretieren (oder in Bytecode kompilieren) könnte.
Aus dem ersten Beispiel wird z.B.
Leider ist die Liste der Dinge, die noch nicht gehen, viel, viel länger :) Da ich schon einmal einen Python 1.4-Interpreter in Java geschrieben habe, ist vieles davon aber Fleißarbeit.
Speziell für die GAE wird eine Sache einfacher: Es gibt keine Threads und man kann hemmungslos den Zustand des Systems in globalen Variablen halten. Auch definiert der Einsatzfall, einen WSGI-artigen HTTP-Request zu bearbeiten, recht genau, was man von der Standardbibliothek braucht und auf was man verzichten kann.
Für die folgenden beiden Probleme hätte ich gerne Rat (oder auch Tat): Ich kann recht leicht einen rekursiven AST-Evaluator bauen, doch damit kann ich AFAIK keine Generatoren implementieren. Was tun? Wie setzt man am besten (und dennoch effizient) Pythons Objektmodell mit all den vielen "under-under"-Methoden um oder sollte man auf diese und die Möglichkeit, Unterklassen vorhandener Klassen bauen zu können, verzichten? Wie würde sich das auf Webanwendungen auswirken?
Stefan
In den letzten Tagen habe ich einen Parser für Python 3.x in Java geschrieben. Er versteht z.B. `[a + 1 for a in b if 2 if 3]` oder `c(a+1 for a in b for c in d)`, auch wenn ich noch eine Reihe von Fehlern beseitigen muss. Der Parser erzeugt einen AST, den man dann im nächsten Schritt interpretieren (oder in Bytecode kompilieren) könnte.
Aus dem ersten Beispiel wird z.B.
Code: Alles auswählen
ListCompr(
Add(Var("a"), Lit(1)),
ComprIf(Lit(3),
ComprIf(Lit(2),
ComprFor(ExprList(Var(a)), Var(b)))))
Speziell für die GAE wird eine Sache einfacher: Es gibt keine Threads und man kann hemmungslos den Zustand des Systems in globalen Variablen halten. Auch definiert der Einsatzfall, einen WSGI-artigen HTTP-Request zu bearbeiten, recht genau, was man von der Standardbibliothek braucht und auf was man verzichten kann.
Für die folgenden beiden Probleme hätte ich gerne Rat (oder auch Tat): Ich kann recht leicht einen rekursiven AST-Evaluator bauen, doch damit kann ich AFAIK keine Generatoren implementieren. Was tun? Wie setzt man am besten (und dennoch effizient) Pythons Objektmodell mit all den vielen "under-under"-Methoden um oder sollte man auf diese und die Möglichkeit, Unterklassen vorhandener Klassen bauen zu können, verzichten? Wie würde sich das auf Webanwendungen auswirken?
Stefan