2009-03-23 5 views
7

Ho bisogno di scrivere un compilatore. Sono i compiti all'univ. L'insegnante ci ha detto che possiamo usare qualsiasi API che vogliamo fare l'analisi del codice, purché sia ​​buona. In questo modo possiamo concentrarci maggiormente sulla JVM che genereremo.Come posso analizzare il codice per creare un compilatore in Java?

Quindi sì, scriverò un compilatore in Java per generare Java.

Conosci qualche buona API per questo? Dovrei usare regex? Normalmente scrivo a mano i miei parser, anche se non è consigliabile in questo scenario.

Qualsiasi aiuto sarebbe apprezzato.

+0

Non sono sicuro di 1.6, ma fino a 1.4 il parser per javac nel Sun JDK è stato scritto a mano. –

risposta

13

Regex è buono da utilizzare in un compilatore, ma solo per riconoscere i token (cioè senza strutture ricorsive).

Il modo classico di scrivere un compilatore sta avendo un lessicale analizzatoreper i token riconoscimento, un analizzatore sintassi per riconoscere struttura, un analizzatore semantico per riconoscere significato, un generatore di codice intermedio, un ottimizzatore e un generatore di codice di destinazione . Ognuno di questi passaggi può essere unito, o saltato del tutto, se facilita la scrittura del compilatore.

Ci sono stati molti strumenti sviluppati per aiutare con questo processo. Per Java, si può guardare al

+1

Mmm e mayby ​​un analizzatore semantico? Per controllare le cose che non possono essere verificate nel parser? –

+0

Nella mia mente, un parser era una sintassi e un analizzatore semantico. Ho aggiornato la risposta per separare i due concetti. –

9

Dai un'occhiata a JavaCC, un parser di lingua per Java. È molto facile da usare e prendere il tempo di

10

Si consiglia di ANTLR, principalmente a causa delle sue capacità di generazione di output tramite StringTemplate.

Ciò che è migliore è che Terence Parr's book sullo stesso è di gran lunga uno dei libri migliori orientati verso la scrittura di compilatori con un generatore di parser.

Quindi hai ANTLRWorks che ti consente di studiare e fare il debug della tua grammatica al volo.

Per completare il tutto, il ANTLR wiki + documentation, (anche se non abbastanza completo per i miei gusti), è un buon punto di partenza per qualsiasi principiante. Mi ha aiutato ad aggiornare le conoscenze sulla scrittura del compilatore in una settimana.

2

Ho ho usato SableCC nel mio corso di compilatore, anche se non per scelta.

Ricordo di averlo trovato molto voluminoso e pesante, con più enfasi sulla pulizia che sulla convenienza (nessuna precedenza dell'operatore o altro, bisogna dichiararlo nella grammatica).

Probabilmente vorrei usare qualcos'altro se avessi la scelta. Le mie esperienze con yacc (per C) e felice (per Haskell) sono state entrambe piacevoli.

2

I combinatori di parser sono una buona scelta. L'implementazione Java popolare è JParsec.

3

JFlex è un generatore di scanner che, in base allo manual, è progettato per funzionare con il generatore di parser CUP.

Uno degli obiettivi principali di progettazione di JFlex era quello di rendere l'interfacciamento con il generatore di parser Java gratuito CUP il più semplice possibile [sic].

Ha anche support per BYACC/J, che, come suggerisce il nome, è un porto di Berkeley YACC per generare il codice Java.

Ho usato JFlex stesso e mi è piaciuto. Comunque, il progetto che stavo facendo era abbastanza semplice da scrivere a mano il parser, quindi non so quanto sia buono CUP o BYACC/J.

1

Suggerisco di guardare all'origine per BeanShell. Ha un compilatore per Java ed è abbastanza semplice da leggere.

Problemi correlati