2009-10-28 18 views
24

Sto lavorando a un progetto di progettazione del compilatore in Java. L'analisi lessicale è fatta (usando jflex) e mi chiedo quale strumento simile a yacc sarebbe il migliore (più efficiente, più facile da usare, ecc.) Per fare analisi sintattica e perché.equivalente Yacc per Java

risposta

16

Se si desidera in particolare un comportamento simile a YACC (basato su tabella), l'unico che conosco è CUP.

Nel mondo Java, sembra che più persone si appoggino a parsers di discesa ricorsivi come ANTLR o JavaCC.

E l'efficienza è raramente un motivo per scegliere un generatore di parser.

+0

Difficoltà: la CUP non viene più mantenuta e [CUP 2] (http://www2.in.tum.de/cup2) è beta. Va ancora bene? – minopret

+0

@minopret - Non ho usato CUP in più di una dozzina di anni, ma a meno che non ci fosse un grosso bug non risolto, allora dovrebbe essere OK anche se non mantenuto attivamente. Tuttavia, a meno che tu non abbia bisogno di un comportamento simile a YACC, guarderei ANTLR. – kdgregory

+0

Sto lavorando a un creatore di file markdown GitHub (.md) che prende un file di codice, scritto in qualsiasi lingua, e genera un file .md per esso. Lo sto facendo in Java. Questi software possono gestire * qualsiasi * lingua o solo Java? –

5

In passato, ho usato ANLTR sia per lesser che per parser e la homepage di JFlex dice che può interagire con ANTLR. Non direi che la documentazione online di ANTLR è eccezionale. Ho finito con l'investire in 'The Definitive ANTLR reference', che mi ha aiutato notevolmente.

+1

Nella mia esperienza, ANTLR è di gran lunga lo strumento più importante per Java lexing/analisi. –

2

Un'altra opzione potrebbe essere GOLD Parser.

A differenza di molte delle alternative, il parser GOLD genera le tabelle di analisi dalla grammatica e le inserisce in un file binario non eseguibile. Ogni lingua supportata dispone quindi di un motore che legge le tabelle binarie e analizza il file sorgente.

Non ho usato l'implementazione Java in modo specifico, ma ho usato il motore Delphi con risultati abbastanza buoni.

2

C'è anche jacc.

Jacc è il più vicino possibile a yacc, ma è implementato in puro java e genera un parser java.

si interfaccia bene con JFLEX

http://web.cecs.pdx.edu/~mpj/jacc/