Создай язык сам, или конструктор для программиста
Спецвыпуск Хакер, номер #004, стр. 004-066-1
The Hound of Winter (thow@ireland.com)
Что я скачал?
В каталоге образовалось несколько файлов - пара с документацией, пара исполняемых EXE-шников и библиотеки для Microsoft Visual C++. Полное название продукта выглядит так: "The Adept Software Programming Language Creator (PLC)". Позволяет сия штучка не много, но достаточно, чтобы играть с ней пару недель. А именно:
1. Имеется встроенный интерпретатор простых конструкций языка Си.
2. Можно создавать свои языки в примитивной форме и получать приличные интерпретаторы.
3. Практически не требует усилий.
4. Распространяется свободно, но с ограничениями - исходники не поставляются, а поставляются уже откомпилированные библиотеки. Исходники можно получить у компании за деньги. ;-(
Чтобы создать свой собственный бейсик или Си-подобный язык, придется немного потрудиться. В общем случае понадобится написать около сотни строк кода. Но все довольно просто, да и архив снабжен работающим примером. Необходимо расписать структуры данных для различных типов нового языка, операторов, ключевых слов и определить процедуру, которая будет реагировать на их появление в тексте программы нового языка.
Как это делается?
Типы переменных интерпретатором определяются автоматически, как в Perl или Python, при использовании этих переменных первый раз. Например, достаточно написать:
example = 1
stringer = "PLC IS COOL!"
И переменная example будет целым числом, а stringer - строкой. Сразу предупреждаю, что интерпретатор не поддерживает язык со структурами, массивами и указателями. ;-( Кроме того, исходный файл на новом языке должен содержать всего две секции: описания глобальных переменных и собственно процедуры на этом языке.
Запуск программы на новом языке происходит в несколько этапов:
1. В программу на Си++ подключаются библиотеки из скачанного архива PLC.
2. Вызывается процедура инициализации PLC_Startup().
3. Вызывается Init() для описанного и используемого языка.
4. Для каждой внешней команды вызывается PLC_AddCommand().
5. Загружается исходник программы для исполнения.
6. Он транслируется с помощью PLC_Compile() и PLC_CompileStatements().
7. Проверяются ошибки.
8. Вызывается PLC_Execute(), и происходит исполнение программы.
9. Проверяются ошибки.
10. Вызывается PLC_Shutdown().
Процедура PLC_CompileStatements() транслирует содержание только одной из процедур в программе. Если же язык не позволяет делить программу на процедуры (бейсик, к примеру) то всю программу можно исполнить, вызвав PLC_CompileStatements() для всего файла с программой.
В общем, прочитав все эти характеристики и инструкции, я решил создать что-то наподобие бейсика - на пробу. И раз уж "инструкция прилагается", то и смотреть надо в нее. В комплекте присутствуют файлы PLC_C.CPP и PLC_C.H - это определение языка для Си. Скопировав их в PLC_BASIC.CPP и PLC_BASIC.H, я приступил к правке этих файлов под бейсик. Файл PLC_BASIC.H можно оставить неизмененным - он подойдет и для бейсика. А вот PLC_BASIC.CPP придется немного переписать.
Первым делом необходимо изменить конструкции PLC_KEYWORD и PLC_OPERATOR, потом немного изменить процедуры ExecKeyword() и ApplyOperator(). Структура PLC_KEYWORD содержит список служебных слов языка, таких как IF, THEN, ELSE, FOR, GOSUB, GOTO. Из файла PLC_BASIC.CPP в этой структуре можно удалить все элементы, кроме вот этих: