MSL FL (SP) - Компилятор своими руками. Шаг 8. Функции? Дайте две!

Oct 19, 2013 21:46

В каждом языке рпограммирования обязаны быть функции, у нас еще нет? Значит делаем! Погнали.

Задача: function test($k, $v){ print('Key: '.$k.' and val: '.$v); } test('box', 'gold');

Очевидно идем в DoCodeFunction() занимающийся обработкой всех функций. И прямо после проверки имена на "for" добавляем проверку на "function":
if(name=="function"){
     DoCodeFunctionFunction(line, to); return ;
}

И вся дальнейшая обработка происходит в этой функции. Кстати, все посты пишутся параллельно с разработкой, и я каждый раз сам не знаю чем закончится пост и какой будет реализация.
Относительно функций, так как код исполняется линейно, функции обязаны быть описаны раньше, чем будут вызваны.

Разбор функции довольно прост. Определяем имя, параметры ни что иное как $val, хм, параметры по умолчанию это в принципе только текст. Дальше ставим флаг активности в ноль и DoCode() ищет от { до }.

Добавлю функцию _skipspace(), она будет пропускать неиспользуемые символы, просто перенес этот код в ункцию:
while(line' ' || *line=='\t' || *line=='\r' || *line=='\n')) line++;

Скоро понадобится определять положение ошибок, и подсчитывать переходы строк. Функция пригодится.
Добавляю новый класс для хранения фунций: msl_function; и добавляю в msl: msl_function functions;

Функции выполняются в DoCodeFunctionExec(). Ищем функцию подходящую по названию и количеству параметров, переопределяем переменные окружения, устанавливаем входящие параметры, запускаем в DoCode();
Для решения задачи потребовалось создать в msl: msl_value *local_value; указывающую на текущую переменную хранящую значения. При вызове функции мы создаем новую msl_value и указываем в local_value на нее.

Код готов, отлажен и работает.  В DoCodeOneValue() нашлась тонна косяков, поправлены. Довольно интересное занятие писать примеры, а потом искать, почему они не работают.
В msl нашелся один неприятный момент. обьявление функции нужно закрывать ';', иначе оно будет записано как значение и будет конфликтовать со следующим кодом. Хотя, добавим переменную в DoCodeFunction(..., int &df), которая будет 1 если это обьявление. Проблема решена.

Все проблемы решены. Больше нас не смогут обвинить в отсутствии функций. Но могут в отсутствиии доступа к глобальным переменным. И в принципе, возможно стоит сделать его так же как в php, чтобы не упускать такую возможность, как переносимость кода.

На этом все. В ближайшем будущем подыщу задачу для реального использования, дабы уменьшить количество багов на единицу кода.
В следующей серии: global? class? внешние функции? отладчик? котики!

"Проект качать отсюда: anon:anon@svn://svn.loglist.org/usr/svn/opensource/msl-fl/ и anon:anon@svn://svn.loglist.org/usr/svn/opensource/msvlib . Исходный код будет тут: http://pastebin.com/Z9tF98TJ. Версия: #define USE_MSLFL_VER 8 "

msl, opensource, msl-fl, c++

Previous post Next post
Up