Создание собственного языка программирования — желание многих программистов. Сейчас данная задача несложно выполнима. Дело в том, что преподавание программирования в физико-математических СУЗах имеет высокий уровень. Не могу не отметить методику И. Р. Дединского и его графическую библиотеку TXLib(The Dump Artist Lobrary). Она имеет сугубый минимализм и подтолкновение человека на do-it-yourself.
Но перейдем к системе. Она включает:
1) Графический движок(сначала хотел использовать TXLib);
2) Стек данных;
3) Численную систему команд;
4) Исполнитель программы;
5) Парсер;
6) Среда.
Система будет разработана на C++(Среда — на C#).
Перейдем к первому модулю.
Графический движок. Сами понимаете, что лучше всего использовать OpenGL, но моя суровость не знала покоя и я написал её, используя векторы и WinAPI.
Для начала надо разработать 2D-графический движок, потом можно добавить еще один слой на окне и фактически 3D готово. Конкретно движок включает в себя довольно много структур для упрощения жизни вам же самим. Советую сделать структуры:
а) Структура окна. Должна содержать дескриптор графического окна, холста, и id окна;
б) Структура рисования. Она в основном состоит из ручки(HPEN), кисти(NBRUSH) и так называемой старой кисти и ручки(HGDIOBJ);
в) Структура данных модуля(версия, ревизия и т.д.)
Советую к движку сделать функцию Update(обновляет окна).
Предложение по реализации:
Сделать вектор memory(неопределенного размера), константные коды примитивов графики (круга, эллипса, линии, прямоугольника и многоугольника). При вызове функции отрисовки или переключения на другое окно сохранять это в memory. А в функции update читать код операции, смотреть, сколько у нее параметров, получать их и потом отрисовывать с полученными аргументами.
На этом закончу говорить про движок графики.
Теперь поговорим про стек.
Итак, в моем компиляторе есть класс Stack, в приватных переменных — вектор команд, аргументов, вектор строк и счетчики сохранения. Так как я не доверяю штатным функциям, отдельно сделаны (в паблике, конечно) push, pop, dump, pushString, popSring.
Теперь расскажу, как они работают.
Push присваивает элементу вектора с id push_count значение введенное в аргумент функции. (И, конечно увеличивает push_count на 1).
Pop присваивает последнему элементу значение 0, и уменьшает push_count на 1.
Dump выводит состояние стека и все его переменные.
pushString и popString работают анологично push и pop, но только с вектором строк.
Про стек еще добавлю, что все помещено в привет, чтобы нельзя было, скажем, так попортить стек, создать константную область, с возможностью изменения штатными функциями класса.
Теперь скажу про команды.
Это просто константы, которые сохраняются в стек и имеют численный вид.
Далее все работает как с графическим update, делаем в стеке функцию get с аргументом id, которая возвращает объект data (память стека) с номером id.
Про исполнитель.
Берем функцией get первый элемент из стека, получаем аргументы и переходим к следующему аргументу.
Парсер читает из файла команду, pushит в стек код операции, берет аргументы. Если команды нет, то отправляет в лог ошибку об отсутствии команды и завершает процесс компиляции. Добавлю лишь о создании отдельной переменной: пушим команду создания, сохраняем имя, проверяем следующий знак, ели это '=', то присвеваем следующее за знаком значение, если ',', то сохранить тип, сохранить имя и так пока знак не равен ';'.
Фактически все о парсере.
О среде скажу только, что там очень много всего и пишется это на другом языке. Не хочу сегодня средой плавить
Автор: aandrew002