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

компилятор ТСС. 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
страница3 из 38
1   2   3   4   5   6   7   8   9   ...   38

и переход redo_no_start, если это '=', выставляется TOK_A_DIV, иначе просто выставляяется токен tok = '/'. case '(': Токены '(', ')', '[', ']', '{', '}', ',', ';', ':', '?', '

', '$', '@' являются простыми и ASCII-символу соответстует такой же токен. default: Если ни одно условие case не сработало, занчит ASCII-символ не распознан, компиляция завершится с ошибкой. tok_flags сбрасывается в ноль при нормальном ходе выполнения. Если бул переход на метку keep_tok_flags, то tok_flags сохнарится. Указатель buf_ptr сдвигается на нужную позицию. static uint8_t *parse_pp_string(uint8_t *p, int sep, CString *str) Функция принимает sep в качестве параметра ASCII-символ обрамляющего строку. Цикл обработки будет продолжаться, пока он не встретится в конце строки. Если встечается '\\', вызывается handle_eob(), если в результате достигнут конец файла (CH_EOF), компиляция завершается с ошибкой, т. к. стрка не закончена. Если встречается '\\', обрабатываются следущей за ней '\n', '\r'. Еще раз проверяется наличие CH_EOF. Символ '\\' и экранируемый ASCII-символ добавляются в строку с помощью cstr_ccat() Если встречается '\n', то обрабатываются '\n' и '\r'. Причем '\r', встерчающийся без '\n', добавляется в строку с пмощью cstr_ccat(), но если они идут вместе, то в строку добавлятется только '\n'. Счетчик строк line_num увеличивается только если встречается '\n' В обычном случае символ просто добавляется в троку. static void parse_escape_string(CString *outstr, const uint8_t *buf, int is_long) Если встечается '\0', завершаем разбор строки. Если встречается '\\': Если дальше одна из 8 цифр, следующие ASCII-символы проверяются функцией isoct(). Она проверяет могут ли они быть частью восмеричного числа. Т.е. пока цифры идут подряд, формируем восмеричное число. Всего проверяется три цифры (первая в case-условии). Результат сложения записывается в переменную c case 'x': Если встречается 'x', 'u', 'U', этот символ пропускается и начинается разбор шестнадцатеричного числа. case 'a': Символы 'a', 'b', 'f', 'n', 'r', 't', 'v' просто экранируются. case 'e': вместо символ 'e' подставляется число 27, если включен флаг gnu_ext case'\'', Появление символа '\'', '\"', '\\' и '?' приводит к завершению case. default: Выводится предупреждение о неправильном экранировании. Если код символа между '!'и и '', то выводится символ, иначе код символа. add_char_nonext: если флаг сброшен вызывается cstr_ccat(), иначе cstr_wccat(); cstr_ccat() или cstr_wccat() вызываются еще раз чтобы добавить нулевой символ в конце строки _______________________ TOK_GET() принимает на входе два указателя. Первый это указатель на токен. А второй, начало цепочки токенов. Токен достается из цепочки и записывается в указатель. При этом в зависимотсти от токена выполняются следующие дополнительные дейстия. Для TOK_CINT, TOK_CUINT, TOK_CCHAR, TOK_LCHAR, TOK_CFLOAT, TOK_LINENUM из цепочки токенов извлекается еще один токен и записыватеся в cv.tab[0] Для TOK_STR, TOK_LSTR, TOK_PPNUM cv.cstr будет указывать на текущие данные за токеном, cv.cstr->data будет укзвать на данные, после структуры описывающей строку (CString) Указатель на цепочку токенов сдвигается на размер той же структуры, cv.cstr->size и дополнительные 3 байта. Итоговое число байт делится на два, т.к. указатель на токен это ссылка на int, т. е. на 16-ти битный тип. Для TOK_CDOUBLE, TOK_CLLONG, TOK_CULLONG cv.tab[0] присваиваются первые 16 бит, идущие за токеном cv.tab[1] на следующие 16 бит. Указатель p сдвигатеся на 2, т. е. на 32 бита. Для TOK_CLDOUBLE: Указетль p сдвигется на знаение LDOUBLE_SIZE (12 байт для x86) деленное на 4. LDOUBLE_GET заполняет cv.tab[0] cv.tab[1] (для x86 еще и cv.tab[2]), данными следующими за токеном. Вернемся к последовательному рассмотрению tcc_new() Для dynarray_add вызывается для s->sections и s->nb_sections, чтобы добавить нулевую секцию.
1   2   3   4   5   6   7   8   9   ...   38


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