предисловие
В этой статье обсуждается, что такое DSL на относительно высоком уровне абстракции, классификация DSL, теоретические знания и некоторые ключевые технические моменты, необходимые для реализации DSL. Пусть читатели получат общее представление о реализации DSL, подробно расскажут о различных технических моментах в последующих статьях и, наконец, используют Javascript для реализации генератора компилятора DSL.
Что такое DSL
DSL (Domain Specific Language) — это компьютерный язык программирования, используемый для решения задач в определенной области.CSS и SQL, которые мы часто используем, относятся к DSL. Есть и другие, такие как языки шаблонов, которые могут быть известны по названию как доменно-ориентированный язык.Кроме того, файл описания образа Docker Dockerfile также является DSL.По сравнению с предметно-ориентированными языками языки программирования общего назначения, такие как поскольку используются C# и Java.
Классификация DSL
Мартин Фаулер делит DSL на внутренний DSL и внешний DSL. Внутренний DSL обычно представляет собой библиотеку классов, инкапсулированную на основе основного языка, которая предоставляет пользователям API с более сильным доменным выражением. Например, API цепных вызовов jQuery можно рассматривать как внутреннюю реализацию DSL. . Реализация внешнего DSL эквивалентна созданию нового языка программирования, и мы можем определить его лексические и грамматические правила в соответствии с требованиями предметной области к выразительности. Мне нужно реализовать компилятор для внешнего DSL, выполнить на нем лексический анализ, синтаксический анализ, семантический анализ и, наконец, сгенерировать целевой язык. Теоретической основой для реализации внешнего DSL является принцип компиляции, DSL, упомянутый в конце статьи, относится к внешнему DSL.
Зачем нужно внедрять DSL
Мы знаем, что в соответствии с различными уровнями абстракции, абстракция Уровень компьютерного программирования Уменьшение языка Уменьшение языка, язык, язык сборки, язык машинного языка. Чем выше уровень абстракции более удобной, тем сильнее производительность, производительность исполнения, тем хуже, чем ниже уровень абстракции, а не более дружелюбная машина, выразительна хуже, тем лучше производительность. Особый язык (DSL), удельный домен (DSL), расположенный над уровнем абстракции на языках компьютерных программиров на высоком уровне. Почему более высокий уровень абстракции, тем больше легко понять, поскольку эта статья стоит на относительно высоком уровне Talk DSL, не обсуждала технические детали слишком много технологий, поэтому не сложно понять.
Понимание компиляции и транспиляции
До и после мы упоминали, что теоретической основой для реализации DSL является принцип компиляции, согласноwikipediaОпределение: Компилятор — это компьютерная программа, которая преобразует исходную программу, написанную на одном языке программирования, в другой язык программирования. Обычно основной задачей компилятора является компиляция исходной программы, написанной на языке высокого уровня, в машинный язык, который может быть распознан машиной. Для реализации компиляции исходной программы компилятору необходимо пройти следующие этапы обработки, как показано на рисунке:
лексический анализ
Лексический анализатор считывает поток символов исходного языка и генерирует последовательность токенов (слов).Токен можно понимать как структуру данных, и токен содержит информацию о своем местонахождении и информацию о типе в исходной программе (включая идентификаторы, ключевые слова, константы). ), операторы и т. д.) и значение, соответствующее маркеру. Конечные автоматы являются теоретической основой лексического анализа.Для заданной входной строки, если она может перейти из начального состояния конечного автомата в несколько состояний через преобразователи состояний и, наконец, достичь конечного состояния конечных автоматов. Говорят, что эта входная строка может быть распознана конечным автоматом, и каждый раз, когда конечный автомат распознает входную строку, она будет добавляться как маркер к распознанной последовательности маркеров. Затем продолжайте идентифицировать последующую входную строку из начального состояния, если конец входной строки не достигает конечного автоматического конечного состояния, это означает, что данная исходная программа содержит лексические ошибки.
Разбор
Основная задача синтаксического анализа состоит в том, чтобы прочитать последовательность токенов, сгенерированную лексическим анализом, а затем построить дерево синтаксического анализа в соответствии с заданной грамматикой. Синтаксический анализ сверху вниз предназначен для построения дерева разбора от верхнего корневого узла к нижнему конечному узлу, а анализ снизу вниз — для построения дерева разбора снизу вверх от нижнего конечного узла к верхнему корневому узлу. Анализ рекурсивного спуска является простейшим алгоритмом синтаксического анализа сверху вниз Метод построения деревьев синтаксического анализа различается в зависимости от грамматики Грамматика описывает правила грамматики языка Грамматика G определяется как четверка, включающая начало грамматики Символ обозначается S, множество терминальных символов обозначается Vt, множество нетерминальных символов обозначается Vn, а множество продукций обозначается P. Ниже приведены обозначения грамматики:
генератор парсеров
Мы можем вручную реализовать DSL-лексер и синтаксический анализатор в соответствии с принципом компиляции, или мы можем использовать некоторые инструменты генератора синтаксических анализаторов для автоматического создания DSL-лексера и синтаксического анализатора. Используя генератор синтаксического анализа, нам нужно только определить лексические правила и правила грамматики DSL, а затем вызвать основную программу генератора компилятора, чтобы она была синтаксическим анализатором DSL. Лексические правила определяются с помощью регулярных выражений, а правила грамматики определяются с помощью EBNF, что позволяет определять контекстно-свободные грамматики. Среди них BISON — генератор синтаксического анализатора, который можно использовать для создания реализации языка C++.Его необходимо использовать в сочетании с лексическим анализатором, созданным Flex, для завершения синтаксического анализа. Среди них ANTLR — генератор синтаксических анализаторов, который может генерировать многоязычные реализации, такие как Java, C++ и Python, В области внешнего интерфейса также есть аналогичный генератор синтаксических анализаторов под названием JISON, который может генерировать парсер, реализованный на Javascript. В следующей статье я также расскажу, как использовать JISON для создания синтаксического анализатора.