2012-12-23 32 views
10

So che ci sono alcune domande vagamente simili relative alle grammatiche BNF (Backus-Naur Form) in Python, ma nessuna di queste mi aiuta molto in termini di applicazione.Come implementare il modulo Backus-Naur in Python

Ho più BNF di cui ho bisogno per scrivere il codice. Il codice dovrebbe essere in grado sia di generare che riconoscere stringhe legali usando la grammatica BNF.

Il primo BNF con cui sto lavorando è per tutti i numeri reali in Python. E 'come segue:

<real number> ::= <sign><natural number> | 
        <sign><natural number>'.'<digit sequence> | 
        <sign>'.'<digit><digit sequence> | 
        <sign><real number>'e'<natural number> 
<sign>   ::= ‘’ | ‘+’ | ‘-‘ 
<natural number> ::= ‘0’ | <nonzero digit><digit sequence> 
<nonzero digit> ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 
<digit sequence> ::= ‘’ | <digit><digit sequence> 
<digit>   ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 

Qualsiasi parser BNF che ho trovato per Python sembrano straordinariamente complesso oppure usa le librerie esterne. C'è un modo più semplice per controllare e generare usando la grammatica BNF in Python?

+3

BNF == Backus Normal Form? Per quelli di noi che non scherzano con parser di grammatica ogni giorno. – Ben

+0

@ Ben sì, hai ragione. Scusa per non aver chiarito, modifico il post – Jakemmarsh

+0

Stai cercando qualcosa che analizzerà un file BNF per generare una grammatica/lexer o qualcosa che puoi scrivere in Python per descriverle un equivalente di BNF? –

risposta

6

This post contiene un esempio di uno scanner lessicale che non richiede librerie di terze parti. Potrebbe non fare tutto quello che vuoi, ma dovresti essere in grado di usarlo come base per qualcosa che si adatta alle tue esigenze.

Non so se le tue applicazioni si riferiscono tutte alla scansione lessicale - ma in caso contrario, ply è un parser abbastanza facile da usare (dato che è necessario sapere a grandi linee come funzionano i parser).


Edit: Un backup della pagina citata è su archive.org:

+0

Apprezzo la risposta.Ho esaminato i tuoi link, ma non sono abbastanza sicuro che siano ciò che sto cercando in questo caso. – Jakemmarsh

+4

Sarebbe un lungo cammino se ti preoccupassi di dire PERCHE 'non è quello che stai cercando. Sai, quindi il prossimo ragazzo può aiutarti. – OmnipotentEntity

+6

il link è morto. è molto utile copiare la parte più importante di essa nella risposta, o anche in tutte. – HuStmpHrrr

7

uno sguardo al https://github.com/erikrose/parsimonious

obiettivi parsimoniosa di essere il parser più veloce arbitraria-lookahead scritto in puro Python-e il più utilizzabile. Si basa sull'analisi di grammatiche di espressione (PEG), il che significa che gli si fornisce un tipo semplificato di notazione EBNF.

3

Ho avuto esperienze positive con grako.

L'ho usato per parseWKT.

Prende un EBNF come input e genera un parser PEG da esso.

penso che sarebbe ragionevole facile scrivere una BNF per EBNF Parser in grako, che sarebbe quindi generare un parser dal EBNF