2009-10-10 21 views
39

Sono in procinto di creare un semplice parser in mini-lingua in Python, programmando vicino al dominio del problema e tutto il resto.Mini-lingue in Python

In ogni caso, mi chiedevo come facessero le persone qui intorno a farlo - quali sono i modi migliori per fare questo genere di cose in Python?

Non ho intenzione di fornire dettagli specifici su cosa sto cercando perché al momento sto solo indagando su quanto sia facile l'intero campo in Python.

Grazie per il vostro contributo!

+1

Simile a: http://stackoverflow.com/questions/2945357/python-how-best-to-parse-a-simple-grammar –

risposta

34

Pyparsing è utile per scrivere "piccole lingue". Ho dato un presentation at PyCon'06 alla scrittura di un semplice motore di gioco di avventura, in cui la lingua che veniva analizzata e interpretata era il set di comandi di gioco ("inventario", "prendi spada", "libretto" ecc.). (Codice sorgente here.)

È inoltre possibile trovare collegamenti ad altri articoli di pyparsing nella wiki pyparsing Publications page.

+6

Pyparsing è una libreria assolutamente fantastico, è possibile analizzare il prossimo a qualsiasi cosa con cerimonia minima. Ho costruito un parser PHP ricorsivo (analisi del codice statico) in due pomeriggi che lo utilizzavano. Non potrei raccomandarlo abbastanza forte. I documenti richiedono circa 2 ore per leggere. –

20

Ho un'esperienza limitata ma positiva con PLY (Python Lex-Yacc). Combina la funzionalità Lex and Yacc in una singola classe Python. Potresti volerlo controllare.

Fellow Stackoverflow'er Ned Batchelder ha uno strumento nice overview disponibile sul suo sito web. C'è anche una panoramica sullo Python website stesso.

3

Per essere produttivi, ho sempre usare un generatore di parser come CocoPy (Tutorial) per avere la grammatica trasformata in un (corretta) parser (a meno che non si desidera implementare il parser manualmente per il bene di apprendimento).

Il resto sta scrivendo l'interprete/compilatore vero e proprio (Crea codice byte stack o memoria AST da interpretare e quindi valuta).

4

Python è un linguaggio straordinariamente semplice ed estensibile che suggerirei semplicemente di creare un modulo python completo e di codificarlo.

Vedo che mentre ho digitato quanto sopra, è già stato menzionato PLY.

19

Vorrei raccomandare funcparserlib. È stato scritto appositamente per l'analisi di piccole lingue e DSL ed è più veloce e più piccolo di pyparsing (vedi le statistiche sulla sua homepage). Minimalisti e programmatori funzionali dovrebbero come funcparserlib.

Modifica: A proposito, sono l'autore di questa libreria, quindi la mia opinione potrebbe essere parziale.

+4

Un tempo ero riluttante a promuovere o difendere il mio modulo di pyparsing - non essere schivo! E sii sicuro di scrivere a Ned Batchelder per aggiungere 'funcparserlib' alla sua pagina compendio di parser, è una risorsa comune (e preziosa) per molti utenti Python alla ricerca di una libreria di analisi. – PaulMcG

+0

@Paul Grazie per il consiglio :) –

+0

Sembra una libreria molto utile, e il codice sembra molto chiaro! Grazie! –

3

Se me lo chiedi ora, proverei la libreria textx per python. Puoi facilmente creare un dsl con Python! I vantaggi sono che crea un AST per te, e il lexing e l'analisi sono combinati.

http://igordejanovic.net/textX/