Domanda

Ho bisogno di scrivere un compilatore. E 'compiti a univ. L'insegnante ci ha detto che possiamo usare qualsiasi API che vogliamo fare il parsing del codice, fino a quando si tratta di un buon compromesso. In questo modo siamo in grado di concentrarsi maggiormente sulla JVM genereremo.

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

Lo sai nulla di buono API per questo? Dovrei usare regex? Io di solito scrivere il mio parser a mano, anche se non è consigliabile in questo scenario.

Qualsiasi aiuto sarebbe apprezzato.

È stato utile?

Soluzione

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

Il modo classico di scrivere un compilatore sta avendo un analizzatore lessicale per gettoni riconoscimento, un sintassi analizzatore per riconoscere struttura, una analizzatore semantico per il riconoscimento significato, un generatore di codice intermedio , un ottimizzatore , e durano generatore di codice di destinazione . Uno qualsiasi di questi passaggi possono essere fuse o saltati del tutto, se rende il compilatore più facile da scrivere.

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

Altri suggerimenti

ANTLR , soprattutto a causa della sua capacità di generazione di potenza tramite StringTemplate.

Cosa c'è di meglio è che libro di Terence Parr sulla stessa è da di gran lunga uno dei libri meglio orientati verso la scrittura compilatori con un generatore di parser.

Poi devi ANTLRWorks che consente di studiare ed eseguire il debug di grammatica al volo.

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

Dai un'occhiata alla JavaCC , un parser lingua per Java. E 'molto facile da usare e ottenere il blocco di

Vai classico - Lex + Yacc. In Java si incantesimi JAX e JavaCC . JavaCC ha anche qualche Java grammatiche pronti per l'ispezione.

Mi consiglia di utilizzare sia un metacompiler come ANTLR , o un semplice parser combinatore biblioteca . Java funzionale ha una parser combinatore API . C'è anche JParsec . Entrambi questi si basano su biblioteca Parsec per Haskell .

JFlex è un generatore scanner che, secondo la manuale , è stato progettato per funzionare con il generatore di parser CUP .

  

Uno dei principali obiettivi di progettazione di JFlex è stato quello di rendere l'interfacciamento con il generatore di parser Java libero CUP facile come forse [sic].

Ha anche supporto 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. Howeveer, il progetto che stavo facendo era abbastanza semplice che ho scritto il parser a mano, in modo da non so quanto bene sia CUP o byacc / J è.

Ho usato sablecc nel mio corso compilatore, anche se non per scelta.

Mi ricordo trovando molto ingombrante e pesante, con più enfasi sulla pulizia di convenienza. (Nessun operatore di precedenza o qualsiasi cosa, devi dichiarare che nella grammatica)

Probabilmente mi voglio usare qualcosa di diverso se avessi la scelta. Le mie esperienze con yacc (per C) e felice (per Haskell) sono stati entrambi piacevole.

combinatori parser è una buona scelta. implementazione popolare Java è JParsec.

Se avete intenzione di andare hardcore, gettare in un po 'di http://llvm.org nel mix:)

Vi suggerisco di guardare al alla fonte per BeanShell. Ha un compilatore per Java ed è abbastanza semplice da leggere.

Utilizzare un combinatore parser, come JParsec . C'è un buon video tutorial su come usarlo .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top