Это небольшая статья, в которой я поделюсь схемой написания своего ЯП (хотя им это назвать сложно) оооочень примитивным способом, но все же.
Начнём, для начала нам нужен исполняемый модуль, в котором будут содержатся описания всех ф-ций нашего ЯПа, примеры буду приводить на языке AutoIt, перевести в какойлибо другой, думаю, не составит труда.
1. Зададим основные сис.переменные и параметры для командной строки, чтобы наша исходная программа, могла принимать параметры при запуске:
Global $File = 'Com.txt', $Array
If $CmdLine[0] = 0 Then $CmdLineRaw = '/File: "example.scode"'
_CmdLineSetEvent('File', '', '_CmdCommand', 'FileOpen')
Переменная файл здесь имеет значение Com.txt изначально, так как нам нужна считка определенного файла при тестировании.
Далее считываем файл и разбиваем его на куски за символом ";" обеспечивая хоть "какой-то" вид синтаксиса:
$Read = FileRead($File)
$Array = StringSplit($Read, ';')
Теперь массив $Array будет содержать куски кода с функциями, описать которые нам ещё предстоит...
Далее анализируем эти "куски" в цикле, предварительно описав 3 ф-ции, но без каких-либо действий в их теле:
For $i = 1 To UBound($Array) - 1
If StringInStr($Array[$i], 'Запуск(') Then
;пусто
ElseIf StringInStr($Array[$i], 'Переменная(') Then
;пусто
ElseIf StringInStr($Array[$i], 'Ждать(') Then
;пусто
EndIf
Next
Как вы видите мы используем простое и неефиктивное форматирование строк, что ооочень ограничивает продвижение нашего ЯПа, но мы ведь не С++ пишем
Теперь давайте опишем ф-цию "Ждать", которая будет содержать всего 1 параметр - это время в милисекундах, и так:
$String = _StringBetween($Array[$i], 'Ждать(', ')') - читаем содержимое в скобках
If IsArray($String) Then
;пока пусто
Else
SetError(1)
ExitLoop
EndIf - проверяем получили ли мы на выходе массив с содержимым, если нет - выдаем ошибку
Sleep($String[0]) - создаем слип с нашим параметром...
Итого имеем:
$String = _StringBetween($Array[$i], 'Ждать(', ')')
If IsArray($String) Then
Sleep($String[0])
Else
SetError(1)
ExitLoop
EndIf
Теперь файл с командой:
Ждать(1000);
в его теле, будет ждать 1 секунду и завершатся
to be continued...
Далее давайте опишем ф-цию "Запуск". Схема почти таже..
$String = _StringBetween($Array[$i], 'Запуск(', ')')
If IsArray($String) Then
Run($String[0])
Else
SetError(1)
ExitLoop
EndIf
Сначало читаем параметры в скобках (он у нас тоже будет всего 1 - это путь к запускаемому *.exe файлу), потом проверяем получила ли ф-ция массив, если она его не получила (а значит неудачное форматирование строки и следовательно неверно составлена ф-ция самим пользователем), то выдаем ошибку и завершаем цикл. Если же все хорошо то запускаем файл из параметра в скобках.
Всеё кажется очень просто...пока мы не столкнемся с первыми подводными камнями...
А первый из них это переменные...
Задайте себе вопрос, "А как программа узнает, что вооон та цифра в ф-ции "Ждать", это переменная, а не просто цифра?"
- интересный вопрос давайте разсмотрим как его решить.
Да, обойти это какмень ещё можно и очень просто, но это пока наш ЯП, ешё маленький и простой с малым числом ф-ций и их параметров, но как только параметров в разных ф-ция станет больше - это станет большой проблем при таком написании ЯПа который я сейчас описываю. Чтож, смотрим решение этой проблемы.
Сначала давайте опишем ф-цию для обьявления переменных:
$String = _StringBetween($Array[$i], 'Переменная(', ')')
If IsArray($String) Then
$Variable = StringSplit($String[0], '=')
If IsArray($Variable) Then
Assign($Variable[1], $Variable[2])
Else
SetError(1)
ExitLoop
EndIf
Else
SetError(1)
ExitLoop
EndIf
Наша ф-ция будет иметь 2 параметра:
название переменной=значение
тоесть будет выглядеть так:
Переменная(иксваб=1000);
Схема всё таже, что и в предидущих ф-ция, описывать нет смысла.
Но как теперь программа определит что надпись, что переменная "иксваб" это число?
А вот как. Вот новое описание ф-ции "Ждать":
$String = _StringBetween($Array[$i], 'Ждать(', ')')
If IsArray($String) Then
If IsDeclared($String[0]) Then
Sleep(Eval($String[0]))
Else
Sleep($String[0])
EndIf
Else
SetError(3)
ExitLoop
EndIf
ка вы видите, мы добавили вариант, в котором мы узнаем, а был ли параметр задеклалирован (обьявлен) ранее, если да, то читаем параметр как переменную, если нет, как исходный текст..
to be continued...
на сегодня прекращаю, если у вас есть вопросы по коду или вам нужно больше исходников или есть пожелания, критика, прошу высказатся 
5. не понимаю, хорошо или плохо.
Если плохо, то да, способ реализации сам по себе ужасен, но лучше я придумать не смог
если хорошо, то советую считать, что это все-таки ужасно
как для первого раза написания своего ЯПа, думаю, в самый раз 
А сейчас давайте обьясним винде, что тип файлов (*.scode например) должен воспроизводится нашей модульной программой. Чтож, создадим reg-файл, в котором будет описание нашего модуля в реестре, код будет таким:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.scode]
@="SC"
[HKEY_CLASSES_ROOT\SC]
@="Description"
[HKEY_CLASSES_ROOT\SC\shell\open\command]
@="C:\\Users\\Андрій\\Desktop\\Новая папка (4)\\1.exe /File \"%1\""
[HKEY_CLASSES_ROOT\SC\defaulticon]
@="C:\\Users\\Андрій\\Desktop\\Новая папка (4)\\1.exe,0"
все пути к екзешнику измените на ваши и нажмите "обновить" в проводнике. Теперь файлы с расширением *.scode будут иметь иконку екзешника и при двойном щелчке исходник будет запускатся на исполнение модулем!

Если хочешь компилить - убери значение переменной $File, и вынь код в комментариях из комметария
08 Фев 2011, 22:46