01.05.2023
статья
Основы лексера и парсера. Свой язык программирования #1

Всем привет!

-= Введение =-
Да, давно у меня не выходили посты... Так-то они выходили, но были в формате "Shorts". Однако я не переставал работать и программировать, поэтому сегодня выходит этот пост. ВПР  мы уже все написали, правда остались ещё годовые контрольные...   Но это уже другая история. Сегодня мы разберём какие бывают языки программирования, из каких частей они состоят и вы даже начнёте писать свой! Через неделю и я поделюсь своим ЯП, ну а вам приятного чтения!


-= Немного пояснения =-
Создание языка программирования можно разделить на 5 этапов и возможно даже все из них мы сегодня рассмотрим.


-= Этап 1: Выбор типа =-
Для начала вам нужно будет определиться будет ли ваш язык программирования компилируемым или интерпретируемым. Между ними есть довольно большая разница, как в реализации, так и в скорости выполнения. Компиляторы анализируют и транслируют весь код в машинный и при этом его не выполняют. Интерпретаторы же в свою очередь построчно выполняют весь полученный код. Также существуют и смеси этих двух видов, которые переводят код в промежуточное представление и выполняют его. Из компилируемых языков можно отметить C, CPP (с плюс плюс). К интерпретируемым относится Python. А в списке гибридов присутствуют C#, Java и PHP
Какой из этих типов выбрать - решать вам. Я лишь скажу, что не стоит выбирать интерпретатор, если свой язык вы будете писать также на интерпретируемом языке, иначе потеряете много производительности.


-= Этап 2: Проработка синтаксиса =-
Как по мне, это самая интересная часть. Выбирайте такой синтаксис, какой будет вам по душе. Хоть на русском, хоть гибрид Python и SQL, что вам будет угодно. Буквально. Или это, только там маты (не видео), поэтому лучше не переходите.


-= Этап 3: Лексер =-
Ну что же, 2 подготовительных этапа мы уже прошли. Теперь можно начинать писать код языка!
Для примера я напишу вот такой код:print: 5 - 2 * a
Сначала вам нужно сделать лексер. Он преобразует ваш код в список токенов. Вот как примерно у ваc должно получиться:

[func: print, int: 5, op: -, int: 2, op: *, var: a]

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


-= Этап 4: Парсер =-
Ну что ж, лексер написали, теперь нужно начинать писать и парсер! И это, пожалуй самый сложный этап. Позже поймёте почему. Парсер преобразует список токенов уже в более менее понятное компьютеру форму дерева. То есть он каждый токен приравнивает к предыдущим и следующим, затем ставит его в нужную ветку. Вот, что примерно у вас получится:

func: print -\
             |
      /--- op: - ---\
      |             |
    int: 5   /--- op: * ---\
             |             |
          int: 2         var: a

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


-= Этап 5: Выполнение кода =-
Это самый важный этап, как нетрудно догадаться. Конечно же вы можете обрабатывать код ещё в парсере, но лично в своём языке я сделал под этот этап отдельную функцию. В принципе, если вы сделали достаточно удобный парсер, то этот этап не составит вам особых проблем.
В результата из этого кода: print: 5 - 2 * a мы получили это - -5, но при условии, что a = 5.


-= Заключение =-
В заключении скажу, что все языки программирования хороши (кроме моего). Ещё скажу, что я решил немного поэкспериментировать с оформлением постов, поэтому жду вашего мнения в комментариях (в будущем будет ещё несколько вариантов). На этом всё. Ставьте лай...   Хотя блин, как я могу просить у вас лайки, после такого долгого отсутствия?!

Всё, всем пока!

Основы лексера и парсера. Свой язык программирования #1Основы лексера и парсера. Свой язык программирования #1
Комментарии (2)
будем ждать продолжения!
Ответ на этот комментарий
8 мая, 2023 в 15:35
|
Тимофей С. 001008
будем ждать продолжения!
Сегодня выйдет)