В этой серии статей мы будем следовать шагам, чтобы построить двигатель Regex в Python. Я выбрал Python На протяжении многих вариантов по нескольким причинам:
- Он хорошо интегрирован с командной строкой Linux
- Потому что да.
В некотором смысле, я нахожу Python, чтобы стать «менее многословной версией Java» и «менее запутанной версией JavaScript», которые были две две альтернативы, которые я рассмотрел.
Пожалуйста, позвольте мне объяснить, прежде чем злиться на меня. Перед началом этого проекта я понятия не имел, как можно сделать вещи, как кодировать различные модули и так далее. Я должен был понять все самостоятельно.
И, когда я не знаю, как именно делать вещи, я нахожу js немного запутанным, это просто чувство, а не универсальная правда, и я нахожу это с Java, я могу лучше организовать свои идеи.
Но, поскольку мне не нравится, насколько многообразным и ограничивающим Java, но хотела занятия, и я люблю иметь функции как граждан первого класса, Python казался идеальной смесью для меня.
Во всяком случае, сейчас пришло время начать с самого проекта.
Чтобы сопоставить строку с регулярным выражением нашей, нам нужно будет выполнить несколько шагов:
- понять регулярное выражение
- Создать Внутреннее представление из этого (так, чтобы мы могли видеть, если с ним пропущенным строке)
- Матч Строка с регулярным выражением, используя внутреннее представление, которое мы построили из него.
Завершить Первые два шага Нам нужны два компонента:
- a Лексера (или сканер) разбираться в анализе Regex в токенах («слова», общие «кусочки информации»). В качестве примера в предложении «я красивый, очень красивый» каждое слово («I», «AM», …) – это токен типа «Word», и запятая – это знак типа «пунктуация»
- А Парсер которые читают все токены в последовательности и «понимают» их, здание при этом это внутреннее представление Regex (которое будет деревом, называемое абстрактным синтаксическим деревом, AST для друзей).
Для достижения третий шаг Нам нужно построить компонент, способный взять в качестве ввода AST, созданный парсером и строкой, и посещение дерева, чтобы соответствовать каждому листу дерева с какой-то частью строки (и что-то большее, мы обсудим позже). Этот компонент называется:
- Двигатель Отказ
Итак, теперь, когда мы знаем модули, которые нам придется код, давайте построим дорожную карту:
- Определите Regex грамматика Мы хотим распознать
- построить лексера
- построить парсер
- построить двигатель
- Наслаждайтесь Отказ
Сейчас время обсудить грамматика Мы хотим распознать.
Я предполагаю, что вы знаете, какая формальная грамматика и что вы понимаете EBNF Обозначение, если нет, Не паникуйте , погугли это.
Грамматика Regex Мы узнаем, что следующее:
Производство верхнего уровня Re Действительно бесполезно, но есть, потому что я использовал его в одной из ранних версий проекта, и мне было лень, чтобы удалить его позже. Во всяком случае, это совершенно безобидно, я обещаю, и это будет стоить вам всего несколько строк кода и только еще один звонок на стек во время выполнения.
Грамматика объяснила
Особенности, которые описанная грамматика сможет реализовать, являются следующими:
Итак, действительные Regexes:
Примеры признанных регенов.
Вы можете просматривать код окончательного результата здесь Отказ
Я думаю, что это может быть достаточно для первой части, больше в следующих статьях серии.
В Следующая статья Мы настроим окружающую среду и начните кодирование, начиная с Lexer.
До скорой встречи! Я надеюсь, что ты наслаждался Это чтение!
Пожалуйста, не стесняйтесь ответить, если вы не понимаете что-то, нужны подсказки, что угодно. Я буду рад ответить вам.
Обложка изображения по Pankaj Patel на Бессмысленно
Оригинал: “https://dev.to/lorenzofelletti/how-to-build-a-regex-engine-in-python-part-1-the-grammar-2coa”