2012-12-23 7 views
10

Wiem, że istnieje kilka niejasno podobnych pytań związanych już z gramatykami BNF (Backus-Naur Form) w Pythonie, ale żaden z nich nie pomaga mi w zakresie mojej aplikacji.Jak zaimplementować formularz Backus-Naur w Pythonie

Mam wiele BNF, które muszę wpisać kod. Kod powinien umożliwiać generowanie i rozpoznawanie ciągów prawnych za pomocą gramatyki BNF.

Pierwszy BNF, z którym pracuję, dotyczy wszystkich liczb rzeczywistych w języku Python. Jest to w następujący sposób:

<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 

Wszelkie Parsery BNF znalazłem dla Pythona wydają się niezwykle skomplikowane, lub korzystać z bibliotek zewnętrznych. Czy istnieje jakiś prostszy sposób sprawdzenia i generowania za pomocą gramatyki BNF w Pythonie?

+3

BNF == Backus postaci normalnej? Dla tych z nas, którzy nie bawią się codziennie analizatorami gramatyki. – Ben

+0

@Ben tak, masz rację. Przepraszam, że nie wyjaśniam, będę edytować post. – Jakemmarsh

+0

Szukasz czegoś, co sparsuje plik BNF, aby wygenerować gramatykę/lexer lub coś, co możesz napisać w Pythonie, aby opisać go jako odpowiednik BNF? –

Odpowiedz

6

This post zawiera przykład skanera leksykalnego, który nie potrzebuje bibliotek innych firm. Może nie robić wszystkiego, co chcesz, ale powinieneś być w stanie użyć go jako podstawy czegoś, co pasuje do twoich potrzeb.

Nie wiem, czy twoje aplikacje odnoszą się do skanowania leksykalnego - ale jeśli nie, to ply jest dość łatwym w użyciu parserem (biorąc pod uwagę, że musisz wiedzieć, jak działa parser).


Edit: Kopia zapasowa cytowanej strony jest archive.org:

+0

Doceniam odpowiedź.Zajrzałem do twoich linków, ale nie jestem do końca pewien, czy są one tym, czego szukam w tym przypadku. – Jakemmarsh

+4

To by się zmieniło, gdybyś chciał powiedzieć, DLACZEGO to nie jest to, czego szukasz. Wiesz, więc następny facet może pomóc. – OmnipotentEntity

+6

link jest martwy. bardzo pomocne jest skopiowanie najważniejszej części do odpowiedzi, a nawet wszystkich. – HuStmpHrrr

7

spojrzeć https://github.com/erikrose/parsimonious

parsimonious ma być najszybszym arbitralne-uprzedzona parser napisany w czystym Pythonie-a najbardziej użyteczny. Oparty jest on na gramatyce parsowania wyrażeń (PEG), co oznacza, że ​​podajesz jej uproszczony rodzaj zapisu EBNF.

3

Miałem dobre doświadczenia z grako.

Użyłem go do parseWKT.

Bierze EBNF jako dane wejściowe i generuje z niego parser PEG.

myślę, że byłoby rozsądne prosty napisać BNF do EBNF Parser w grako, które następnie wygenerować parser z EBNF

Powiązane problemy