Автор оригинала: FreeCodeCamp Community Member.
Christopher Diggins.
Важный и полезный инструмент, который уже является частью арсеналов большинства программистов, является доверием регулярное выражение Отказ Но помимо того, что ложь контекстные грамматики. Это простая концепция с необычным названием.
Регулярное выражение – это способ проверки и нахождения шаблонов в тексте. Виды шаблонов (ака грамматики), которые могут быть описаны и обнаружены с использованием регулярного выражения, называются Регулярные языки Отказ Регулярные языки являются самыми простой формальными языками в Чомская иерархия Отказ
Регулярные выражения отлично подходят для поиска или проверки многих типов простых шаблонов, например номеров телефонов, адресов электронной почты и URL. Однако они падают, когда применяются к узорам, которые могут иметь рекурсивную структуру, такую как:
- HTML/XML Открыть/Закрыть Теги
- Открытые/закрытые брекеты {/} в языках программирования
- Открытые/закрытые скобки в арифметических выражениях
Чтобы разбирать эти типы шаблонов, нам нужно что-то более мощное. Мы можем перейти к следующему уровню формальных грамматиков, называемых Контекст бесплатные грамматики (CFG).
Разборка математических выражений
Разбор на множество всех математических выражений находится за пределами силы истинного регулярного выражения. Причина в том, что они могут содержать произвольно глубокие вложенные пары скобок.
Например, рассмотрим выражение: (2 + (3 * (7-4)))
Обратите внимание, что структура арифметического выражения эффективно является деревом:
+ / \ 2 * / \ 3 - / \ 7 4
Структура дерева, генерируемая в результате работы анализатора CFG, называется Разбор дерева Отказ
Описывающие контекстно-бесплатные грамматики
Существует два популярных метода выражения CFG грамматиков:
- Удлиненный Bachus-Naur Form (EBNF) – описывает CFG с точки зрения Правила производства Отказ Это правила, которые при применении могут генерировать все возможные правовые фразы на языке.
- Разборная экспрессия грамматики (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 – это крошечный язык программирования, разработанный специально для того, чтобы помочь людям узнать о методах реализации языков программирования.
Если вам понравилась эта статья, пожалуйста, дайте мне знать и подумайте об этом с друзьями и коллегами.