Ich muss einen Compiler schreiben. Es sind Hausaufgaben an der Uni. Der Lehrer sagte uns, dass wir jede API verwenden können, die wir für die Analyse des Codes verwenden möchten, solange es ein guter Code ist. Auf diese Weise können wir uns stärker auf die JVM konzentrieren, die wir generieren werden.
Also, ich schreibe einen Compiler in Java, um Java zu generieren.
Kennst du eine gute API dafür? Soll ich Regex verwenden? Ich schreibe normalerweise meine eigenen Parser von Hand, obwohl es in diesem Szenario nicht ratsam ist.
Jede Hilfe wäre willkommen.
Regex kann in einem Compiler verwendet werden, aber nur zum Erkennen von Token (d. h. keine rekursiven Strukturen).
Die klassische Art, einen Compiler zu schreiben, ist ein lexikalischer Analysator zum Erkennen von Token, ein Syntaxanalysator zum Erkennen von Strukturen, ein semantischer Analysator zur Erkennung von Bedeutung, ein Zwischencode-Generator , ein Optimierer und zuletzt ein Zielcodegenerator . Jeder dieser Schritte kann zusammengeführt oder vollständig übersprungen werden, wenn der Compiler einfacher zu schreiben ist.
Es wurden viele Werkzeuge entwickelt, um diesen Prozess zu unterstützen. Für Java können Sie sich
ansehenIch würde ANTLR empfehlen, hauptsächlich wegen seiner Fähigkeiten zur Ausgabeerzeugung über StringTemplate.
Was ist besser ist, dass Terence Parrs Buch auf dem gleichen ist bei weitem eines der besseren Bücher ausgerichtet auf das Schreiben von Compilern mit einem Parsergenerator.
Dann haben Sie ANTLRWorks , mit denen Sie Ihre Grammatik im Handumdrehen studieren und debuggen können.
Um das Ganze noch zu übertreffen, die ANTLR wiki + Dokumentation , (obwohl nicht umfassend genug für mich), ist ein guter Ausgangspunkt für Anfänger. Es half mir, das Wissen über Compiler-Schreiben in einer Woche zu aktualisieren.
Gehen Sie klassisch - Lex + Yacc. In Java heißt es JAX und javacc . Javacc hat sogar einige Java-Grammatiken zur Überprüfung bereit.
Ich würde empfehlen, entweder einen Metacompiler wie ANTLR oder einen einfachen Parserkombinator Bibliothek. Funktionales Java hat ein Parser-Kombinator-API . Es gibt auch JParsec . Beide basieren auf der Parsec-Bibliothek für Haskell .
JFlex ist ein Scannergenerator, der laut Handbuch , wurde entwickelt, um mit dem Parser-Generator CUP zu arbeiten.
Eines der Hauptziele von JFlex bestand darin, die Verbindung mit dem kostenlosen Java-Parser-Generator CUP so einfach wie möglich zu gestalten.
Es hat auch Unterstützung für BYACC / J , die, wie der Name schon sagt, ein Port von Berkeley YACC ist, um Java-Code zu generieren.
Ich habe JFlex selbst benutzt und mochte es. Wie auch immer, das Projekt, das ich machte, war einfach genug, dass ich den Parser von Hand schrieb, also weiß ich nicht, wie gut CUP oder BYACC / J ist.
Ich habe SableCC in meinem Compiler-Kurs verwendet, allerdings nicht nach Wahl.
Ich erinnere mich, dass ich es sehr sperrig und schwergewichtig fand, mit mehr Nachdruck auf Sauberkeit als auf Bequemlichkeit (keine Vorrangstellung des Bedieners oder irgendetwas; das muss man in der Grammatik angeben).
Ich würde wahrscheinlich etwas anderes verwenden wollen, wenn ich die Wahl hätte. Meine Erfahrungen mit yacc (für C) und happy (für Haskell) waren beide angenehm.
Parser-Kombinierer ist eine gute Wahl. Beliebte Java-Implementierung ist JParsec.
Ich schlage vor, Sie betrachten die Quelle für BeanShell. Es hat einen Compiler für Java und ist ziemlich einfach zu lesen.
Ссылка und Ссылка enthalten Kataloge von Tools für diese. Vergleichen Sie auch die Stackoverflow-Frage Alternativen zu regulären Ausdrücken .
Verwenden Sie einen Parser-Kombinator, wie JParsec . Es gibt ein gutes Video-Tutorial zur Verwendung .
Tags und Links java parsing compiler-construction parser-generator