Как реализовать форму Backus-Naur в Python
Я знаю, что есть некоторые смутно похожие вопросы, уже относящиеся к грамматикам BNF (Backus-Naur Form) в Python, но ни один из них не помогает мне с точки зрения моего приложения.
У меня есть несколько BNFs, для которых мне нужно написать код. Код должен иметь возможность генерировать и распознавать юридические строки с помощью грамматики 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?
3 ответов
этот пост содержит пример лексического сканера, который не нуждается в сторонних библиотеках. Он может не делать все, что вы хотите, но вы должны иметь возможность использовать его в качестве основы для чего-то, что соответствует вашим потребностям.
Я не знаю, все ли ваши приложения относятся к лексическому сканированию , но если нет,ply - довольно простой в использовании парсер (учитывая, что вам нужно знать, как работают Парсеры).
Edit: резервная копия цитируемой страницы включена archive.org:
взгляните на https://github.com/erikrose/parsimonious
Parsimonious стремится быть самым быстрым произвольным синтаксическим анализатором, написанным на чистом Python, и наиболее удобным. Он основан на разборе грамматик выражений (колышков), что означает, что вы кормите его упрощенным видом обозначения EBNF.