Рубрики
Без рубрики

Как построить двигатель Regex в Python (часть 1: Грамматика)

В этой серии статей мы будем следовать шагам, чтобы построить двигатель Regex в Python. Я выбираю Python … Помечено Python, программирование, регулирование, кодирование.

В этой серии статей мы будем следовать шагам, чтобы построить двигатель Regex в Python. Я выбрал Python На протяжении многих вариантов по нескольким причинам:

  1. Он хорошо интегрирован с командной строкой Linux
  2. Потому что да.

В некотором смысле, я нахожу Python, чтобы стать «менее многословной версией Java» и «менее запутанной версией JavaScript», которые были две две альтернативы, которые я рассмотрел.

Пожалуйста, позвольте мне объяснить, прежде чем злиться на меня. Перед началом этого проекта я понятия не имел, как можно сделать вещи, как кодировать различные модули и так далее. Я должен был понять все самостоятельно.

И, когда я не знаю, как именно делать вещи, я нахожу js немного запутанным, это просто чувство, а не универсальная правда, и я нахожу это с Java, я могу лучше организовать свои идеи.

Но, поскольку мне не нравится, насколько многообразным и ограничивающим Java, но хотела занятия, и я люблю иметь функции как граждан первого класса, Python казался идеальной смесью для меня.

Во всяком случае, сейчас пришло время начать с самого проекта.

Чтобы сопоставить строку с регулярным выражением нашей, нам нужно будет выполнить несколько шагов:

  1. понять регулярное выражение
  2. Создать Внутреннее представление из этого (так, чтобы мы могли видеть, если с ним пропущенным строке)
  3. Матч Строка с регулярным выражением, используя внутреннее представление, которое мы построили из него.

Завершить Первые два шага Нам нужны два компонента:

  • a Лексера (или сканер) разбираться в анализе Regex в токенах («слова», общие «кусочки информации»). В качестве примера в предложении «я красивый, очень красивый» каждое слово («I», «AM», …) – это токен типа «Word», и запятая – это знак типа «пунктуация»
  • А Парсер которые читают все токены в последовательности и «понимают» их, здание при этом это внутреннее представление Regex (которое будет деревом, называемое абстрактным синтаксическим деревом, AST для друзей).

Для достижения третий шаг Нам нужно построить компонент, способный взять в качестве ввода AST, созданный парсером и строкой, и посещение дерева, чтобы соответствовать каждому листу дерева с какой-то частью строки (и что-то большее, мы обсудим позже). Этот компонент называется:

  • Двигатель Отказ

Итак, теперь, когда мы знаем модули, которые нам придется код, давайте построим дорожную карту:

  1. Определите Regex грамматика Мы хотим распознать
  2. построить лексера
  3. построить парсер
  4. построить двигатель
  5. Наслаждайтесь Отказ

Сейчас время обсудить грамматика Мы хотим распознать.

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

Грамматика Regex Мы узнаем, что следующее:

Производство верхнего уровня Re Действительно бесполезно, но есть, потому что я использовал его в одной из ранних версий проекта, и мне было лень, чтобы удалить его позже. Во всяком случае, это совершенно безобидно, я обещаю, и это будет стоить вам всего несколько строк кода и только еще один звонок на стек во время выполнения.

Грамматика объяснила

Особенности, которые описанная грамматика сможет реализовать, являются следующими:

Итак, действительные Regexes:

Примеры признанных регенов.

Вы можете просматривать код окончательного результата здесь Отказ

Я думаю, что это может быть достаточно для первой части, больше в следующих статьях серии.

В Следующая статья Мы настроим окружающую среду и начните кодирование, начиная с Lexer.

До скорой встречи! Я надеюсь, что ты наслаждался Это чтение!

Пожалуйста, не стесняйтесь ответить, если вы не понимаете что-то, нужны подсказки, что угодно. Я буду рад ответить вам.

Обложка изображения по Pankaj Patel на Бессмысленно

Оригинал: “https://dev.to/lorenzofelletti/how-to-build-a-regex-engine-in-python-part-1-the-grammar-2coa”