Python è un linguaggio di scripting bella. Dà anche di accedere a un proprio parser e compilatore. Essa dà anche accesso a diversi altri parser per scopi speciali come modelli XML e di stringa.
Ma a volte si consiglia di avere il proprio parser. Questo è ciò che è pyPEG per.
Per ottenere una rapida visione su ciò che sta accadendo, si prega di leggere questo articolo su come analizzare un linguaggio arbitrario XML con pyPEG sul mio blog.
Che cosa è PEG?
PEG significa Parsing Expression Grammar. E 'qualcosa di simile l'idea di espressioni regolari per il contesto lingue gratuiti; una chiara spiegazione troverete in questo articolo di Wikipedia su PEG.
Con PEG è possibile descrivere le stesse lingue come con BNF (e loro sono anche simili).
Che cosa è un parser-interprete?
Parser comuni non stanno usando PEG e top-down parsing, ma LR (n) o LL (n) e l'analisi bottom-up. Il risultato è l'idea di attuare generatori di parser.
Perché con LR (n) o LL (n) parser è necessario calcolare un DFA prima, di solito si lascia il generatore di parser fare questo per voi. Il risultato è una implementazione parser per la grammatica BNF, che era l'ingresso. Si potrebbe chiamare un generatore di parser un compilatore da BNF a un'implementazione parser.
A Parser-interprete funziona come interprete, invece di essere un tale compilatore. Basta dare la grammatica come input, e analizza il linguaggio descritto dal testo. Non saranno programma generato.
Utilizzo pyPEG
Ciò significa: utilizzando pyPEG è molto semplice;-) Se si conosce già le espressioni regolari, si impara ad utilizzare pyPEG rapidamente.
Un piccolo campione
Un esempio: pensare ad un linguaggio semplice come questo:
Funzione FAK (n) {
& Nbsp; if (n == 0) {// 0! è 1 per definizione
& Nbsp; ritorno 1;
& Nbsp;} else {
& Nbsp; ritorno n * FAK (n - 1);
& Nbsp;};
}
Un pyPEG per tale lingua sembra il seguente codice (vedi anche lo script di esempio):
Commento def (): ritorno [re.compile (r "//.*"), re.compile ("/*.*?*/", re.S)]
def letterale (): ritorno re.compile (".? *" r'd * .d * | | d + ')
simbolo def (): ritorno re.compile (r "w +")
operatore def (): ritorno re.compile (r "+ | - | * | / | ==")
operazione def (): simbolo di ritorno, operatore, [letterale, FunctionCall]
espressione def (): ritorno [letterale, il funzionamento, FunctionCall]
def listaespressioni (): return espressione, -1, (",", espressione)
def returnstatement (): parola chiave return ("ritorno"), espressione
def ifstatement (): parola chiave return ("se"), "(", espressione, ")", il blocco, parola chiave ("altro"), blocco
dichiarazione def (): ritorno [ifstatement, returnstatement], ";"
Blocco def (): return "{", -2, affermazione, "}"
def parameterlist (): return "(", simbolo, -1, ("," simbolo), ")"
def FunctionCall (): il simbolo di ritorno, "(", listaespressioni, ")"
funzione def (): parola chiave return ("funzione"), simbolo, parameterlist, blocco
def simpleLanguage (): funzione di ritorno
Cosa c'è di nuovo in questa versione:
- Questa è una versione di pulizia. Il codice di parse () e comporre () è stato fissato.
Cosa c'è di nuovo in versione 1.4:.
- Questa versione corregge alcuni bug con packrat analisi
Cosa c'è di nuovo nella versione 1.3:
- Sostituzione della tupla per i nomi Pyast dal simbolo (lista ) di classe, che è abbastanza compatibile, ma supporta il codice più descrittivo backend compilatore, anche.
Cosa c'è di nuovo in versione 1.2:.
- sono stati fissati Bugs con Unicode in gestione degli errori >
Cosa c'è di nuovo nella versione 1.1:.
- è stato aggiunto il supporto Unicode
Cosa c'è di nuovo in versione 0.46:.
- pyPEG.print_trace True
- Conversione pyPEG a Python 3.x ora funziona perfettamente con 2to3
- Le regole grammaticali che vengono applicate possono essere opzionalmente tracciato impostando
- pyPEG sarà in uscita questa traccia per stderr.
Cosa c'è di nuovo in versione 0.45:.
- Bugfixes
Cosa c'è di nuovo in versione 0.44:
- pyPEG ora decora ogni oggetto Pyast con il nome del file di origine e la linea numero.
Requisiti :
- Python
I commenti non trovato