Как реализовать форму Бэкуса-Наура в 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 == Бэкус Нормальная форма? Для тех из нас, кто не играет с синтаксическими анализаторами грамматики каждый день.   -  person Ben    schedule 23.12.2012
comment
@ Бен, да, ты прав. Извините, что не уточняю, я отредактирую сообщение   -  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: мертвая ссылка. Поиск в Google строк 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, и наиболее удобным. Он основан на синтаксическом анализе грамматик выражений (PEG), что означает, что вы скармливаете ему упрощенную нотацию EBNF.

person cleder    schedule 17.05.2013

У меня был хороший опыт работы с грако.

Я использовал его для parseWKT.

Он принимает EBNF в качестве входных данных и генерирует из него синтаксический анализатор PEG.

Я думаю, что было бы разумно просто написать BNF для EBNF Parser в grako, который затем будет генерировать синтаксический анализатор из EBNF.

person cleder    schedule 01.04.2014