Domanda

Sto cercando un generatore di parser per Java che esegua le seguenti operazioni: Il mio progetto linguistico è piuttosto semplice e contiene solo un piccolo set di token.

Output in puro codice Java LEGGIBILE in modo che io possa modificarlo (questo perché non dovrei usare ANTLR) Libreria matura, che funzionerà e funzionerà con almeno Java 1.4

Ho esaminato quanto segue e potrebbero funzionare: JavaCC, jlex, Ragel?

È stato utile?

Soluzione

Dovresti usare Rats ... In questo modo, tu non devi separare lexer e parser e quindi se vuoi estendere il tuo progetto sarà banale. È in Java e quindi puoi elaborare il tuo AST in Java ...

Altri suggerimenti

Forse stai cercando il parser combinatori invece del parser generatori ? Vedi questo documento e JParsec .

È davvero una cattiva idea modificare il codice parser generato - è molto più semplice modificare il file grammaticale e quindi ricompilarlo. A meno che tu non lo stia facendo per scopi educativi, nel qual caso ANTLR è orgoglioso di generare codice abbastanza leggibile per un generatore di parser così potente.

Ho avuto una buona esperienza SableCC .

Funziona diversamente dalla maggior parte dei generatori, in quanto ti viene dato un modello AST / Visitor che estendi (tramite ereditarietà).

Non posso commentare la " qualità " del suo codice in termini di leggibilità (è da un po 'che non lo uso), ma ha la qualità che non è necessario leggere il codice. Solo il codice nella sottoclasse.

Forse ANTLR lo farà per te. È un buon generatore di parser con un libro disponibile per la documentazione.

Dai un'occhiata a SableCC . Sablecc è un generatore di parser facile da usare che accetta la grammatica della tua lingua come EBNF, senza mescolare codice di azione, e genera un parser Java che produce un albero di sintassi che può essere attraversato usando un visitatore del nodo dell'albero. SableCC è potente, ma molto più semplice da usare rispetto a ANTLR, JavaCC, yacc, ecc. Inoltre non richiede un lexer separato. Costruire il tuo elaboratore linguistico equivale ad estendere una classe visitatore generata dalla tua grammatica e a sovrascrivere i suoi metodi che sono chiamati quando il parser incontra un costrutto sintattico. Per ogni regola grammaticale XYZ, il visitatore avrà un metodo inAXYZ (Nodo xyz) .... outAXYZ (Nodo xyz) chiamato quando il parser corrisponde alla regola.

Per una lingua così semplice, JFlex potrebbe essere sufficiente. È simile a JLex ma più veloce (che potrebbe anche significare meno leggibile, ma non ho visto Output di JLex).

È un lexer, non un parser, ma è costruito per interfacciarsi facilmente con CUP o BYacc / J . E ancora, per un linguaggio semplice, potrebbe essere più semplice scrivere il proprio parser (l'ho già fatto prima).

Stiamo usando JavaCC per il nostro (anche un linguaggio piuttosto piccolo) e ne siamo contenti.

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