Создание языка программирования на python

Решил попробовать создать пока что простенький язык программирования, который будет иметь задание переменных, арифметика (+ - * /), логические конструкции (== != < >) if/elif/else и цикл for, p() (print()) Всё должно работать ровно как в python.

Уже пробовал с нейросетью, пользовался ply и др. Немного получалось, но было множество ошибок, да и в общем-то я не понимал ничего.

К вопросу. Как написать этот язык программирования? Где можно прочитать про особенности создания, чтобы понять, как пишется код. Также можете, если не трудно, написать этот код и показать как он дорабатывается.


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Лиха беда начало:

python.py:

import sys

exec(open(sys.argv[1]).read())

sum.py:

a = int(input())
b = int(input())
c = a + b
print(c)
$ python python.py sum.py
2
40
42

Но это для разогрева. А на самом деле вам нужно решить следующие задачи:

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

  • состояние: вам нужно придумать структуру данных, которая будет хранить все имена и значения переменных, указатель на текущую исполняемую инструкцию и что там ещё понадобится.

  • интерпретатор: он читает очередную инструкцию на которую указывает указатель, и изменяет состояние: определяет новую переменную или проверяет условие, переносит указатель текущей инструкции. Это делается в цикле, пока программа не завершится.

Самая сложная штука тут – компилятор. Чтобы его было проще написать, надо упростить первую версию вашего языка максимально. Например: for – сложная конструкция, но любой for можно заменить while. Если у вас есть if, то, в приципе, можно обойтись без elif и else. Сложные выражения - удобно, но можно обойтись только конструкциями вида a = 1 + b. И так далее.

Продолжать?

→ Ссылка