2012-12-23 13 views
10

Ich weiß, es gibt einige vage ähnliche Fragen bereits in Bezug auf BNF (Backus-Naur Form) Grammatiken in Python, aber keiner von ihnen hilft mir viel in Bezug auf meine Anwendung.Wie man Backus-Naur Form in Python implementiert

Ich habe mehrere BNFs, für die ich Code schreiben muss. Der Code sollte in der Lage sein, legale Strings unter Verwendung der BNF-Grammatik sowohl zu generieren als auch zu erkennen.

Die erste BNF, mit der ich arbeite, ist für alle reellen Zahlen in Python. Es ist wie folgt:

<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 

Alle BNF-Parser ich für Python gefunden haben scheinen außerordentlich komplex oder außerhalb Bibliotheken. Gibt es einen einfacheren Weg, um mit BNF-Grammatik in Python zu überprüfen und zu generieren?

+3

BNF == Backus-Normalform erzeugen würde? Für diejenigen von uns, die nicht täglich mit Grammatikparsern herumspielen. – Ben

+0

@Ben ja, du hast Recht. Entschuldigung für die Unklarheit, ich werde den Beitrag bearbeiten – Jakemmarsh

+0

Suchen Sie nach etwas, das eine BNF-Datei analysieren wird, um eine Grammatik/Lexer oder etwas zu generieren, das Sie in Python schreiben können, um ihm ein Äquivalent von BNF zu beschreiben? –

Antwort

6

This post enthält ein Beispiel für einen lexikalischen Scanner, der keine Bibliotheken von Drittanbietern benötigt. Es kann nicht alles tun, was Sie wollen, aber Sie sollten es als Grundlage für etwas verwenden können, das Ihren Bedürfnissen entspricht.

Ich weiß nicht, ob Ihre Anwendungen alle auf lexikalische Scans beziehen - aber wenn nicht, ply ist ein ziemlich einfach zu Parser zu verwenden (vorausgesetzt, dass Sie im Großen und Ganzen wissen müssen, wie Parser arbeiten).


Edit: Eine Sicherung der genannten Seite ist auf archive.org:

+0

Ich schätze die Antwort.Ich habe mir deine Links angesehen, aber ich bin mir nicht ganz sicher, ob sie in diesem Fall das sind, wonach ich suche. – Jakemmarsh

+4

Es würde einen langen Weg gehen, wenn Sie erwähnen würden, warum es nicht das ist, wonach Sie suchen. Weißt du, der nächste kann helfen. – OmnipotentEntity

+6

der Link ist tot. Es ist wirklich hilfreich, den wichtigsten Teil davon in die Antwort oder sogar alle zu kopieren. – HuStmpHrrr

7

haben einen Blick auf https://github.com/erikrose/parsimonious

Parsimonious Ziele der schnellste willkürlichen-Look-Ahead-Parser in rein geschrieben werden Python-und das verwendbarste. Es basiert auf Parsing Expression Grammatiken (PEGs), was bedeutet, dass Sie eine vereinfachte Art der EBNF-Notation verwenden.

3

Ich hatte gute Erfahrungen mit grako.

Ich habe es für parseWKT verwendet.

Es benötigt einen EBNF als Eingabe und generiert daraus einen PEG-Parser.

ich denke, es einfach sinnvoll wäre, eine BNF zu EBNF Parser in Grako zu schreiben, die dann einen Parser aus der EBNF