
Пишем свой «Язык программирования» на Python3
1. Лексер
В этой статье мы сделаем, так сказать python2, создание переменных, вывод их в консоль
Если вам зайдёт, то сделаю 2 часть поста :D
Для начала, определимся с названием языка — к примеру «xnn»
Теперь создадим файл xnn.py и запишем туда основной код:
import sys #Импортируем библиотеку sys
import os #Импортируем библиотеку os
dir = os.path.abspath(os.curdir) #Узнаём откуда запущен компилятор
p = str(dir) + '\\' + str(sys.argv[1]) #sys.argv[1] - определяем 1 аргумент
print(p) # Выводим ддиректорию + файл
modules = ['if', 'else', 'while', 'for', '=', '==', '{', '}', '[', ']', '(', ')', '//'] #Создаём все зарезервированные слова
var = [] #Создаём список для лексера
vars_ = {} #Создаём список для переменных
with open(p, 'r', encoding="UTF-8") as f: #Отрываем файл из аргумента
for ex in f.read().split(): #Распределяем все слова
var.append(ex) #Записываем все слова в список var
print(var) # $ Выводим список $
Что мы делаем:
- Импортируем библиотеки os и sys
- С помощью os определяем откуда запущен компилятор, (в будущем раскажу зачем)
- Создаём путь к файлу + берём сам файл из аргумента — получаем его через sys.argv
- Дальше выводим сам путь, с файлом (в будущем это надо будет удалить)
- Создаём все зарезервированные слова — пока, нам это не надо, но в будещем понядобиться дял вывода ошибок
- Создаём списки для лексера и переменных
- Создаём сам лексер, для этого открываем файл, в режиме чтения, обязательно в
encoding=«UTF-8»
если этого не сделать, то вместо русских букв, будут иероглифы! - С помощью for ex in read().split() распределяем весь текст на слова и помещаем каждое слово отдельно в ex
- Дальше записываем каждое слово в список var
- И выведим сам список — в будущем нужно будет удалить вывод :/
Создание файла .xnn
Теперь создадим сам файл который будем парсить, а также изменим способ открытия

Откроем его и запишем туда:
pr = Привет
rprint pr
2. Создание Компилятора
Теперь создадим компилятор!
Для этого дополним наш файл кодом, чтобы получилось вот так:
import sys #Импортируем библиотеку sys
import os #Импортируем библиотеку os
dir = os.path.abspath(os.curdir) #Узнаём откуда запущен компилятор
p = str(dir) + '\\' + str(sys.argv[1]) #sys.argv[1] - определяем 1 аргумент
print(p) # Выводим ддиректорию + файл
modules = ['if', 'else', 'while', 'for', '=', '==', '{', '}', '[', ']', '(', ')', '//'] #Создаём все зарезервированные слова
var = [] #Создаём список для лексера
vars_ = {} #Создаём список для переменных
try:
with open(p, 'r', encoding="UTF-8") as f: #Отрываем файл из аргумента
for ex in f.read().split(): #Распределяем все слова
var.append(ex) #Записываем все слова в список var
print(var) # $ Выводим список $
a = -1 #Устанавливаем значение на каком сейчас var
for i in var: #Перебираем все значения
a = a + 1 #Добавляем что это значение просмотренно
if i == '=': #Если находим совпадение с "="
vars_[var[a-1]] = var[a+1] #в список vars_ добавляем занчение до и после "="
if i == 'rprint':
let = var[a+1]
for key, value in vars_.items():
if key == let:
print(value)
except FileNotFoundError:
print('Error! Файл не найден!')
Что мы делаем?
Мы перебираем все значения в var и при нахождении того или инного зарезервировонного слова, делаем определённые действия
Присваивание переменных
При совпадении i с "=" добавляем в список vars_ значение, до "=" как key, а после "=", как value — таким образом образуя переменную
Вывод переменных
При совпадении i с «rprint» ищем в списке vars_ совпадение для этой переменной, которое получаем через нашего друга, списка var
После нахождение выводим значение переменной
Работа в действии
Для того чтобы скомпилировать файл, вводим данные команды в cmd:
cd path/to/files
python xnn.py prog.xnn
На выход получаем:
C:\Users\Hoopengo\Desktop\xnn\prog.xnn
['pr', '=', 'Привет', 'rprint', 'pr']
Привет
3. Компиляция в .exe
Создадим копию папки с файлами и отредактируем файл xnn.py
import sys #Импортируем библиотеку sys
import os #Импортируем библиотеку os
dir = os.path.abspath(os.curdir) #Узнаём откуда запущен компилятор
p = str(dir) + '\\' + str(sys.argv[1]) #sys.argv[1] - определяем 1 аргумент
modules = ['if', 'else', 'while', 'for', '=', '==', '{', '}', '[', ']', '(', ')', '//'] #Создаём все зарезервированные слова
var = [] #Создаём список для лексера
vars_ = {} #Создаём список для переменных
try:
with open(p, 'r', encoding="UTF-8") as f: #Отрываем файл из аргумента
for ex in f.read().split(): #Распределяем все слова
var.append(ex) #Записываем все слова в список var
a = -1 #Устанавливаем значение на каком сейчас var
for i in var: #Перебираем все значения
a = a + 1 #Добавляем что это значение просмотренно
if i == '=': #Если находим совпадение с "="
vars_[var[a-1]] = var[a+1] #в список vars_ добавляем занчение до и после "="
if i == 'rprint':
let = var[a+1]
for key, value in vars_.items():
if key == let:
print(value)
except FileNotFoundError:
print('Error! Файл не найден!')
Установим auto-py-to-exe
Полная информация по установке есть по этой ссылке
Введём в консоль:
pip install auto-py-to-exe
auto-py-to-exe
Запустится браузер. Выбираем там путь к файлу и One File

4. Создание установщика
В копированной папке создадим файл bat.py:
import os
with open('path\\xnn.exe', 'r', encoding='UTF-8') as f:
lean = f.read()
directory_folder = r"C:\\Windows\\System32\\xnn.exe"
folder_path = os.path.dirname(directory_folder) # Путь к папке с файлом
if not os.path.exists(folder_path): #Если пути не существует создаем его
os.makedirs(folder_path)
with open(directory_folder, 'w', encoding='UTF-8') as file: # Открываем фаил и пишем
file.write(lean)
После этого компилируем его в .exe и бросаем в туже директорию, должно получится так:

5. Установка
Теперь установим
Для этого отроем файл bat.exe, после чего произведотся установка
Перезапустим консоль и введём:
cd path/to/file
xnn prog.xnn
И получим:
Привет
Если пишет что «xnn не является внутренней командой», то самостоятельно добавьте файл xnn.exe в папку «C:\Windows\System32\».
TheGodfather
/me подавился чаем
Вы серьезно? Это что и зачем вообще?
Если автор школьник — то похвально, немножко разобрался, что-то сделал, не постеснялся выложить. Можно дать замечаний по коду (однобуквенные переменные там), по терминологии («компилятор» это вообще не то, что пишется в посте) и проч. Но если автор — не школьник, то этому даже в песочнице не место.
Firesieht
Автор сравнительно молод, ибо если верить его профилю, то ему 14 лет и это действительно похвально, радует, что есть те, кто рад делится своими находками, достижениями.
TheGodfather
Меня смутила приписка «Web-developer» под ником в статье, не смотрел в профиль :)
Тогда несколько более конструктивных замечаний автору на будущее:
0. Хабр — жестокое место :) Но это не отменяет того факта, что вы на самом деле молодец, что нашли в себе силы написать пост. Да, есть много странных вещей, но главное — опыт. Не расстраивайтесь и не опускайте руки.
0.2. Как уже написали, у вас ни компилятора ни «языка программирования» не наблюдается. И если даете названия языку, то интересно добавить пояснения. Почему XNN? Первая картинка в голове это типа eXtended Neural Network :)
1. Используйте факт вашего возраста. Могу ошибиться, но тут было несколько предыдущих статей начинающихся с «Всем привет, я Вася и учусь в 8 классе» — это сразу задает тон и люди будут более снисходительны к таким ошибкам, за которые обычную статью сразу вгонят в глубокий минус (как случилось с вами сейчас).
2. Слишком много ненужных комментариев в коде. От того, что к каждой строке писать комментарий, код не становится чище, даже наоборот. Комментарии должны пояснять неочевидные моменты (а в идеале их вообще не должно быть, и все должно быть понятно без комментариев).
3. Писать сразу функциональный код в файле не стоит. Это немного ухудшает читаемость, но, что важнее, делает по сути невозможным переиспользование ваших функций в других файлах. Представьте, что у вас есть другой проект и вам надо проанализировать файл на вашем «языке программирования». Тогда вы хотите сделать что-то вроде
А не копировать весь код.
Типичный boilerplate код в Питоне для такого:
Таким образом, когда интерпретатор загружает этот файл, «прогружаются» только определения функций, но на самом деле исполнения не происходит (если только файл не запущен самостоятельно)
4. Для парсинга аргументов командной строки обычно используется argparse, а не ручная обработка sys.argv
5. Размер блока try в try..except лучше делать минимальным. В вашем случае «except» стоило написать сразу после блока with open()...., поскольку исключение FileNotFound может возникнуть только там. Таким образом, улучшается читаемость и уменьшается степень вложенности.
6. Ну и System32. Никогда, нет, НИКОГДА не предлагайте людям положить какой-то левый файл в системные директории. Вообще говоря, почти любая программа должна работать, если ее просто нормально запустить с параметрами (ну типа «C:\users\qqq\Desktop\xnn.exe C:\users\qqq\Documents\somefile.xnn»). Но если вам не хочется писать целиком путь до программы, то можно ее местоположение добавить в переменную окружения PATH (как для Windows, так и на Linux). Эффект будет таким же.
hoopengo Автор
hoopengo Автор
Привет! Да мне 14 лет. Сейчас карантин и я пытаюсь реализовывать некоторые идеи, тк скучно. Сейчас к примеру делаю с друзьями свой мессенджер.
hoopengo Автор
да, 14 лет. Кстати удивлён 1.8 к просмотров, хоть и негатива многО)