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

Помимо регулярных выражений: введение в анаразбивные грамматики без контекста

Christopher Diggins за пределами регулярных выражений: введение в анализ контекстно-бесплатной граммармсфото на Йоханнес Пленио на Unsplashan Важный и полезный инструмент, который уже является частью большинства арсеналов в программистах, является доверительным регулярным выражением. Но помимо того, что ложь контекстные грамматики. Это простая концепция с необычным названием.

Автор оригинала: FreeCodeCamp Community Member.

Christopher Diggins.

Важный и полезный инструмент, который уже является частью арсеналов большинства программистов, является доверием регулярное выражение Отказ Но помимо того, что ложь контекстные грамматики. Это простая концепция с необычным названием.

Регулярное выражение – это способ проверки и нахождения шаблонов в тексте. Виды шаблонов (ака грамматики), которые могут быть описаны и обнаружены с использованием регулярного выражения, называются Регулярные языки Отказ Регулярные языки являются самыми простой формальными языками в Чомская иерархия Отказ

Регулярные выражения отлично подходят для поиска или проверки многих типов простых шаблонов, например номеров телефонов, адресов электронной почты и URL. Однако они падают, когда применяются к узорам, которые могут иметь рекурсивную структуру, такую как:

  • HTML/XML Открыть/Закрыть Теги
  • Открытые/закрытые брекеты {/} в языках программирования
  • Открытые/закрытые скобки в арифметических выражениях

Чтобы разбирать эти типы шаблонов, нам нужно что-то более мощное. Мы можем перейти к следующему уровню формальных грамматиков, называемых Контекст бесплатные грамматики (CFG).

Разборка математических выражений

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

Например, рассмотрим выражение: (2 + (3 * (7-4)))

Обратите внимание, что структура арифметического выражения эффективно является деревом:

  + / \ 2   *   / \  3   -     / \     7 4

Структура дерева, генерируемая в результате работы анализатора CFG, называется Разбор дерева Отказ

Описывающие контекстно-бесплатные грамматики

Существует два популярных метода выражения CFG грамматиков:

  1. Удлиненный Bachus-Naur Form (EBNF) – описывает CFG с точки зрения Правила производства Отказ Это правила, которые при применении могут генерировать все возможные правовые фразы на языке.
  2. Разборная экспрессия грамматики (PEG) – описывает CFG с точки зрения Правила признания Отказ Это правила, которые могут быть использованы для соответствия действительным фразам на языке.

Формализм PEG имеет преимущество перед EBNF, что отображение на анализаторе однозначно, и может быть легко автоматизирована.

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

Expr ← SumSum ← Product (('+' / '-') Product)*Product ← Value (('*' / '/') Value)*Value ← [0–9]+ / '(' Expr ')'

На простом английском языке мы можем прочитать это как:

  • Expr это Сумма
  • Сумма это Продукт сопровождаемый нолью или более подпассы, которые состоят из «+» или «-», а затем Продукт
  • Продукт это Ценность сопровождаемый нолью или более подпаблонами, которые состоят из «*» или «/», а затем Значение
  • Ценность является либо одним или несколькими элементами набора символов {0, .. 9}, либо это открытая скобка »(« с последующим EXPR и закрывающая скобка »).

Генераторы парсеров против библиотек разборки

Предполагая, что вы не тот человек, который любит изобретать колесо (не то, что в этом есть что-то не так), вообще есть два варианта создания парсера:

1. Используйте генератор парсера – инструмент, который генерирует исходный код для анализатора из абстрактного определения парсера. Некоторые популярные примеры в JavaScript включают Джисон , Peg.js , блинли и Antlr Отказ

2. Используйте библиотеку разборки – Библиотека, которая позволяет выражать правила анализа как API. Некоторые примеры в JavaScript включают Myna , Parsimmon и Chevrotain Отказ

Мое предпочтение состоит в том, чтобы использовать библиотеки разборки, потому что их легче понимать, отлаживать, поддерживать и настраивать.

Письменные анализаторы в Tymdercript/JavaScript с использованием библиотеки анализа Myna

Недавно проект, над которым я работал ( Язык цапля ) Требуется библиотеку анализа, которая может работать в браузере. Я нашел сложность и накладные расходы существующих библиотек слишком велики. Учитывая, что у меня был предыдущий опыт написания библиотек разбросов в C ++ и C #, я решил написать Библиотека парсера под названием Myna Использование Teamscript Отказ

Myna использует Свободный синтаксис (метод цепи) Чтобы легко определить анализатор в качестве набора правил (подпунктер), напоминающий грамматику PEG.

В следующем примере есть из Myna Github Reppo :

Из бетонного синтаксического дерева (CST) до абстрактного синтаксического дерева (AST)

Когда анализатор обрабатывает вход, каждое успешно сопоставлено правило (производство грамматики AKA) можно сопоставить с узлом в дереве разбора. Это буквальное отображение правил производства к узлам в дереве – это Бетонное синтаксическое дерево (CST).

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

Самое простое, что нужно сделать, это только создавать узлы в выводе дерева для конкретных правил и пропустить другие правила. Эта упрощенная версия дерева разбора называется Абстрактное синтаксическое дерево (АСТ) Отказ Может быть несколько проходов, выполняемых на AST, чтобы преобразовать его в альтернативные представления AST, чтобы упростить более поздние этапы обработки.

В Myna, AST создается путем создания узлов из правил, помеченных с помощью AST имущество. Технически это свойство возвращает новое правило, которое имеет внутренний набор свойств, который сообщает анализатору для генерации узла разбора в дереве разбора.

Используя генерируемую Myna абстрактное синтаксическое дерево

Вот пример использования анализатора, определенного Myna в «Node.js» для оценки арифметического выражения:

Окончательные слова

Если вы заинтересованы в том, чтобы узнать больше о создании и использовании парсеров, будь то библиотека Myna, соответствует вашим конкретным потребностям, я рекомендую вам занять немного времени, чтобы прочитать через Исходный код библиотеки Parsing Myna Отказ

Myna была написана в Tymdercript (которая имеет знакомый синтаксис для большинства программистов), содержится в одном файле без зависимостей и составляет менее 1200 строк, включая подробную документацию.

Если вы заинтересованы в видительном видимости, примененной к более сложному сценарию, посмотрите на Язык программирования Chickadee Отказ Это реализовано полностью в Teadercript и зависит только от Библиотека разбойности Myna Отказ Chickadee – это крошечный язык программирования, разработанный специально для того, чтобы помочь людям узнать о методах реализации языков программирования.

Если вам понравилась эта статья, пожалуйста, дайте мне знать и подумайте об этом с друзьями и коллегами.