Исходя из механического фона, мне было трудно понять, как на самом деле работает компилятор? Я хотел бы поделиться здесь своими знаниями.

Если я спрошу вас: Что нам нужно для написания нового языка программирования? Не могли бы вы сначала подумать о синтаксисе языка? Или вы бы подумали о ключевых словах, грамматике, типах данных, алгоритмах для оптимизации вашего языка и множестве других вещей? Я думал то же самое изначально.

Но о чем нам следует подумать в первую очередь?

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

О Джисоне:

Jison - генератор парсеров. Он принимает контекстную грамматику в качестве входных данных и выводит файл JavaScript, способный анализировать язык, описываемый этой грамматикой. (Проще говоря, контекстно-свободная грамматика - это правила, которые используются для создания строковых шаблонов). Затем мы можем использовать этот сгенерированный скрипт для анализа входных данных, написанных на нашем языке, и принятия, отклонения или выполнения действий с ними. После того, как вы сгенерировали парсер и сохранили его, вам больше не понадобится Jison или какие-либо другие зависимости.

Вам потребуется следующая настройка на вашем компьютере,

  1. Jison (установите его здесь)
  2. node js (установите здесь)

Вам также необходимо знать о следующих понятиях:

Токены:

Жетоны - это базовые блоки зданий на любом языке. Его можно рассматривать как наименьшую уникальную единицу грамматики языка.

Некоторые примеры токенов:

Лексический анализ:

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

Анализ синтаксиса:

Следующий этап называется синтаксическим анализом или синтаксическим анализом. Он принимает маркер, полученный в результате лексического анализа, в качестве входных данных и генерирует дерево синтаксического анализа (или дерево синтаксиса). На этом этапе расположение токенов проверяется на соответствие грамматике исходного кода, то есть синтаксический анализатор проверяет, является ли выражение, созданное токенами, синтаксически правильным.

Узнайте больше о лексическом анализе и токенизации в следующем видео -

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

Узнайте больше об этих этапах в этом видео.

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

Есть особый способ написать грамматику в Jison. Он может распознавать языки, описываемые грамматиками LALR.

Пример:

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

  • 2+1
  • 4*3
  • (3+4)*8

Токенизация:

Давайте возьмем указанный выше поток символов и проанализируем их один за другим. Сопоставьте их со значимыми именами (токенами), как показано ниже.

Это войдет в наш файл "grammar.jison".

Теперь нам нужно написать грамматику для того же самого.

Грамматика:

Нам нужно написать грамматику таким образом, чтобы наш синтаксический анализатор мог анализировать комбинации выражений в файле. Следовательно, наша грамматика будет такой:

Ниже приведены возможные комбинации для нашего выражения.

Эта грамматика также войдет в ваш файл «grammar.jison». В нашей грамматике expr можно заменить на (expr + expr) или (expr * expr) и так далее. Кроме того, expr может быть простым числом, например следующим:

Оценка:

Нам также необходимо оценить наши выражения. Например, если наше выражение - выражение1 + выражение2, тогда оно должно добавить выражение1 и выражение1.

Есть способ оценить наше выражение в грамматике jison.

Здесь $ 1 - это первый токен expr, $ 2 - токен «+», $ 3 - второй токен expr, а $$ - результат выражения. Нам нужно определить оценки для каждой комбинации выражения.

Таким образом, окончательный файл «grammar.jison» будет выглядеть так:

Наконец, выполните следующие команды в командной строке

jison grammar.jison

Эта команда сгенерирует файл grammar.js. Чтобы сгенерировать файл с некоторым числовым выражением, выполните следующую команду.

эхо «12 + 14» ›testInput

Запустите сгенерированный файл парсера с вводом как testInput, как показано ниже:

узел grammar.js testInput

Вы увидите результат как 26. Попробуйте дать любое выражение с комбинацией чисел и операций +, -, *, ^ и /, оно сможет его решить.

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

Спасибо за просмотр моего блога. Если у вас есть отзывы, поделитесь со мной.