Главная страница

компилятор ТСС. Tiny c compiler by Fabrice Bellard Описание алгоритмов


Скачать 191.99 Kb.
НазваниеTiny c compiler by Fabrice Bellard Описание алгоритмов
Анкоркомпилятор ТСС
Дата08.11.2019
Размер191.99 Kb.
Формат файлаodt
Имя файлаtcc book.odt
ТипДокументы
#94047
страница10 из 38
1   ...   6   7   8   9   10   11   12   13   ...   38
static inline int *macro_twosharps(const int *macro_str) Переданный указатель сохраняется в переменную start_macro_ptr. Бесконечный цикл завершит функцию если достигнут конец строки или прервется если обнаружит токен TOK_TWOSHARPS. Текущая позиция указателя сохраняется в macro_str1 до вызова TOK_GET() С помощью cstr_new() заполняется нулями cstr - временный экземплят структуры Cstring С помощью tok_str_new() обнуляются поля структуры TokenString по адресу macro_str1. Текущий глобальный токен (переменная tok) обновляется значением полученого токена Текущая структура CValue (переменная tokc) обновляется значением полученным вместе с токеном. Токены начиная с позиции start_macro_ptr и заканчивая macro_ptr1 извлекаются с помощью TOK_GET() и записываются во вновь создаваемую строку с помощью tok_str_add2() macro_ptr обновляяестя адресом сохраненным непосредственно перед обнаружением TOK_TWOSHARPS. Пока токен по адресу macro_ptr это TOK_TWOSHARPS происходит следующая обработка. Указатель macro_ptr сдвигается на одну позицию вперед и сохраняется в macro_ptr1. Текущий токен получатся из адреса macro_ptr без его сдвига. Если код полученого токена не нулевой, он получается еще раз со сдвигом, с помощью TOK_GET(). Эта же функция обновляет временный токен и верменную структуру CValue. Структура Cstring заполняется нулями с помощью cstr_reset() Функция get_tok_str() вызывается для tok и tokc. Полученная строка ASCII символов добавляется в итоговую строку с помощью cstr_cat() Функция get_tok_str() вызывается для временного токена и верменной структуру CValue. Полученная строка ASCII символов добавляется в итоговую строку с помощью cstr_cat(). Функция вызывается еще раз чтобы добавить нулевой символ. Глобальный токен (переменная tok) проверяется на следующие условие: он должен быть больше TOK_IDENT или равен TOK_PPNUM при этом временный токен (переменая t) больше TOK_IDENT или равен TOK_PPNUM. Если tok равен TOK_PPNUM, присходит запись в переменную tokc (текущий экземпляр CValue). Меняется поле-указатель на Cstring. Для этого очищается память по адресу tokcstr и ему присвавается адрес итоговой строки. Сама итоговоя строка очищается с помощью cstr_new() Если временный токен (переменная t) равен TOK_PPNUM, Будем использовать укзазтель полученый несколько шагов назад когда была вызвана get_tok_str() вызывается для временного токена и верменной структуру CValue. Будем обрабатывать ASCII-символы до того как встерим нулевой символ. Будем сдвигать указтель и проверять является ли ASCII-символ числом или может сулжить частью идентификатора. Если проверка неудачна, переходим на метку error_pasting Если глобальный токен не TOK_PPNUM и в не зависимости от значения временного токена вызывается tok_alloc() для итоговой строки. Глобальный токен обновляется указательем на токен из полученной структуры TokenSym Если условия проверки глобального и временного токена не выполнены, начинаем проверять ASCII-символы в итоговой строке. Если строка начинается с ">>=", выставляется глобальный токен TOK_A_SAR, если "<<=" выставляется токен TOK_A_SHL. Если два предыдущих условия не сработали, но длинна послеовательностьи ASCII-символов равна двум байтам, происходит поиск по массиву tok_two_chars на каждом шаге указатель в массиве сдвигается на 3 байта, перед этим ASCII символ по текущему указатели и следующий за ним сравниваются с ASCII символами в строке. Если совпадение найдено, то цикл прерывается, если достигнут конец массива но совпадение не найдно, присходит переход на метку error_pasting В конце цикла, т. е. если он прервется до достижения конца массива, выставляется токен равный числу, которое является третьм байтом из тройки. Начиная с метки error_pasting начинаестся вывод предупреждения, что не подстановка завершилась неудачей. Для этого подготавливается экземпляр структуры Cstring, в нее записывается строка полученная для глбоального токена и нулевой символ. Кроме этой строки в предупреждении выводится строка полученная для временного токена. При этом получая стоку для глобального токена мы обновляем глобальное занчение CValue и передаем его на вход tok_str_add2(), затем обновляе его временным значением CValue, полученным в процессе получения строки для временного токена. Значение глобального токена обновляется значением временного. Когда заканчивается поиск TOK_TWOSHARPS, вызывется tok_str_add2() для глобального токена и глобальной структуры CValue. Затем вызывается next_nomacro() и продолжается бесконечный цикл, пока поток глобольных токенов не иссякнет (указатель tok не станет равен 0) Указатель macro_ptr обновяется занечением saved_macro_ptr Освобождается временная структура Cstring, цепочку macro_str1 добавляется ноль. Функция возвращает адрес первого ASCII символа из строки связанной с macro_str1 (экземпляр TokenString)
1   ...   6   7   8   9   10   11   12   13   ...   38


написать администратору сайта