Как да внедрите Backus-Naur Form в Python

Знам, че вече има някои смътно подобни въпроси, свързани с BNF (Backus-Naur Form) граматики в Python, но никой от тях не ми помага много по отношение на моето приложение.

Имам множество BNF, за които трябва да напиша код. Кодът трябва да може както да генерира, така и да разпознава правни низове, използвайки BNF граматиката.

Първият BNF, с който работя, е за всички реални числа в Python. Той е както следва:

<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

Всички анализатори на BNF, които намерих за Python, изглеждат изключително сложни или използват външни библиотеки. Има ли по-прост начин за проверка и генериране с помощта на BNF граматика в Python?


person Jakemmarsh    schedule 23.12.2012    source източник
comment
BNF == Нормална форма на Backus? За тези от нас, които не си играят с граматически анализатори всеки ден.   -  person Ben    schedule 23.12.2012
comment
@Ben да, прав си. Съжалявам, че не поясних, ще редактирам публикацията   -  person Jakemmarsh    schedule 23.12.2012
comment
Търсите ли нещо, което ще анализира BNF файл, за да генерира граматика/лексер или нещо, което можете да напишете на Python, за да му опишете еквивалент на BNF?   -  person Jon Clements♦    schedule 23.12.2012
comment
@JonClements Предполагам, че повече търся нещо, което мога да напиша на Python, за да му опиша еквивалент на BNF, ако те разбирам правилно.   -  person Jakemmarsh    schedule 23.12.2012
comment
Добре – най-дружелюбната и многофункционална библиотека, която все още е в процес на активна разработка, която съм използвал и която използва базирани на Python обекти за описание на граматики, е pyparsing .wikispaces.com   -  person Jon Clements♦    schedule 23.12.2012
comment
@JonClements Срещах pyparsing няколко пъти, докато проучвах това. Въпреки това, от това, което видях, не изглежда съвсем в състояние да приложи нещо като BNF по-горе?   -  person Jakemmarsh    schedule 24.12.2012
comment
@Jakemmarsh би било - пробвал ли си? Също така си струва да се отбележи, че ако вашият BNF е типичен за изразяването на типове на Python, тогава можете да мамите и да използвате неговите ast и tokenize библиотеки   -  person Jon Clements♦    schedule 24.12.2012
comment
Какви библиотеки и инструменти разгледахте и какво не е наред с тях?   -  person Marcin    schedule 24.12.2012


Отговори (3)


Тази публикация съдържа пример за лексикален скенер, който не се нуждае от библиотеки на трети страни. Може да не прави всичко, което искате, но трябва да можете да го използвате като основа за нещо, което отговаря на вашите нужди.

Не знам дали всичките ви приложения са свързани с лексикално сканиране - но ако не, ply е сравнително лесен за използване анализатор (като се има предвид, че трябва да знаете в общи линии как работят анализаторите).

person Vinay Sajip    schedule 23.12.2012
comment
Оценявам отговора. Разгледах връзките ви, но не съм съвсем сигурен, че те са това, което търся в случая. - person Jakemmarsh; 24.12.2012
comment
Ще бъде много полезно, ако си направите труда да споменете ЗАЩО това не е това, което търсите. Знаеш ли, така че следващият човек може да помогне. - person OmnipotentEntity; 24.12.2012
comment
връзката е мъртва. наистина е полезно да копирате и поставите най-важната част от него в отговора или дори всички. - person Jason Hu; 23.06.2015
comment
Re: мъртвата връзка. Търсене в гугъл на низовете sexy lexing python намира тема на Reddit reddit.com/r/programming/comments /7ztdm/sexy_lexing_in_python и може би архив тук: itpub.net/archiver/ tid-1794484.html - person Fuhrmanator; 03.04.2016
comment
Архивната връзка е празна? - person Ekrem Dinçel; 27.05.2020

разгледайте https://github.com/erikrose/parsimonious

Parsimonious има за цел да бъде най-бързият анализатор с произволен поглед напред, написан на чист Python - и най-използваемият. Базиран е на граматики за анализ на изрази (PEGs), което означава, че го захранвате с опростен вид EBNF нотация.

person cleder    schedule 17.05.2013

Имах добър опит с grako.

Използвах го за parseWKT.

Той приема EBNF като вход и генерира PEG анализатор от него.

Мисля, че би било разумно просто да се напише BNF към EBNF анализатор в grako, който след това ще генерира анализатор от EBNF

person cleder    schedule 01.04.2014