Wie kann ich Code analysieren, um einen Compiler in Java zu erstellen?

7

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.

    
fmsf 23.03.2009, 08:44
quelle

12 Antworten

13

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

ansehen
Markus Jarderot 23.03.2009, 09:06
quelle
10

Ich 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.

    
Vineet Reynolds 23.03.2009 08:58
quelle
9

Sehen Sie sich JavaCC an, einen Sprachparser für Java. Es ist sehr einfach zu bedienen und den Dreh raus

    
tddmonkey 23.03.2009 08:50
quelle
6

Gehen Sie klassisch - Lex + Yacc. In Java heißt es JAX und javacc . Javacc hat sogar einige Java-Grammatiken zur Überprüfung bereit.

    
gimel 23.03.2009 08:50
quelle
5

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 .

    
Apocalisp 23.03.2009 14:24
quelle
3

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.

    
Michael Myers 23.03.2009 13:57
quelle
2

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.

    
Jonas Kölker 23.03.2009 09:35
quelle
2

Parser-Kombinierer ist eine gute Wahl. Beliebte Java-Implementierung ist JParsec.

    
stepancheg 23.03.2009 11:58
quelle
1

Wenn Sie Hardcore gehen wollen, werfen Sie ein bisschen Ссылка in den Mix ein:)

    
snemarch 23.03.2009 09:27
quelle
1

Ich schlage vor, Sie betrachten die Quelle für BeanShell. Es hat einen Compiler für Java und ist ziemlich einfach zu lesen.

    
Peter Lawrey 23.03.2009 19:42
quelle
1

Ссылка und Ссылка enthalten Kataloge von Tools für diese. Vergleichen Sie auch die Stackoverflow-Frage Alternativen zu regulären Ausdrücken .

    
Hans-Peter Störr 23.01.2010 17:44
quelle
0

Verwenden Sie einen Parser-Kombinator, wie JParsec . Es gibt ein gutes Video-Tutorial zur Verwendung .

    
nes1983 14.04.2012 12:27
quelle