Xwab
Форумыnavigate_nextДругие языки программирования

Пишем свой Язык программирования
Сообщения
Fever

Это небольшая статья, в которой я поделюсь схемой написания своего ЯП (хотя им это назвать сложно) оооочень примитивным способом, но все же.

Начнём, для начала нам нужен исполняемый модуль, в котором будут содержатся описания всех ф-ций нашего ЯПа, примеры буду приводить на языке 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...


__________
посл.ред. 01 Фев 2011, 23:51; всего 1 раз 01 Фев 2011, 22:23
Fever

Далее давайте опишем ф-цию "Запуск". Схема почти таже..

$String = _StringBetween($Array[$i], 'Запуск(', ')')
If IsArray($String) Then
Run($String[0])
Else
SetError(1)
ExitLoop
EndIf

Сначало читаем параметры в скобках (он у нас тоже будет всего 1 - это путь к запускаемому *.exe файлу), потом проверяем получила ли ф-ция массив, если она его не получила (а значит неудачное форматирование строки и следовательно неверно составлена ф-ция самим пользователем), то выдаем ошибку и завершаем цикл. Если же все хорошо то запускаем файл из параметра в скобках.

Всеё кажется очень просто...пока мы не столкнемся с первыми подводными камнями...

01 Фев 2011, 22:33
Fever

А первый из них это переменные...

Задайте себе вопрос, "А как программа узнает, что вооон та цифра в ф-ции "Ждать", это переменная, а не просто цифра?"
- интересный вопрос давайте разсмотрим как его решить.

Да, обойти это какмень ещё можно и очень просто, но это пока наш ЯП, ешё маленький и простой с малым числом ф-ций и их параметров, но как только параметров в разных ф-ция станет больше - это станет большой проблем при таком написании ЯПа который я сейчас описываю. Чтож, смотрим решение этой проблемы.

Сначала давайте опишем ф-цию для обьявления переменных:

$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...

01 Фев 2011, 22:45
Fever

на сегодня прекращаю, если у вас есть вопросы по коду или вам нужно больше исходников или есть пожелания, критика, прошу высказатся

01 Фев 2011, 22:51
Felis

леденящая душу реализация

01 Фев 2011, 23:39
Fever

5. не понимаю, хорошо или плохо.

Если плохо, то да, способ реализации сам по себе ужасен, но лучше я придумать не смог

если хорошо, то советую считать, что это все-таки ужасно

как для первого раза написания своего ЯПа, думаю, в самый раз

01 Фев 2011, 23:41
Fever

А сейчас давайте обьясним винде, что тип файлов (*.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 будут иметь иконку екзешника и при двойном щелчке исходник будет запускатся на исполнение модулем!

03 Фев 2011, 23:01
[ADMIN99]

Интересно достаточно, давай au3 файл сделанный тобою

08 Фев 2011, 17:03
Fever

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

08 Фев 2011, 22:46
[ADMIN99]

без компиля ошибка какаято...

11 Фев 2011, 18:18
Ответить на тему