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

компилятор ТСС. 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
страница19 из 38
1   ...   15   16   17   18   19   20   21   22   ...   38
static void type_decl(CType *type, AttributeDef *ad, int *v, int td) Пока '*' является текущим тореном вызывается next() чтобы проверить следующий токен. В зависимости от него в переменной qualifiers выставляются биты VT_CONSTANT, VT_VOLATILE а так же пропускаются часть токенов. В конце каждого шага вызывается mk_pointer() и поле t созданного типа устанавливаются биты нокопленные в qualifiers Если текущий токен это TOK_ATTRIBUTE1 или TOK_ATTRIBUTE2, вызывается parse_attribute() Если текущий токен '(', то вызывается next(), Если текущий токен это TOK_ATTRIBUTE1 или TOK_ATTRIBUTE2, вызывается parse_attribute() Вызывается type_decl() для type1. Вызывается skip(), чтобы пропустить ')' Елсли текущий токен отличается от '(', код токена может быть больше заранее определенного и в переданном значении установлены биты входящие в TYPE_DIRECT В этом случае в переданный указатель v записывается значение текущего токена и вызывается next() Если проверка завершилась неудачно, в переданном значении проверяется наличие бита TYPE_ABSTRACT Если его нет, компилятор завершается с ошибкой. В переданный указатель v записывается 0 Вызывается post_type() Если текущий токен это TOK_ATTRIBUTE1 или TOK_ATTRIBUTE2, вызывается parse_attribute() Если в поле t временного типа было установлено значение, функция завершается. Происходит обход цепочки типов начиная со временного. Цепочка связана по полю ref. По ней извлекается символ и в нем берется тип. И так далее. Если в процессе обхода обнаруживается тип с ненулевым полем t, в текущий ардес обхода записывается переданный функции тип. В адрес переданного функции типа записывается временный тип. static void parse_attribute(AttributeDef *ad) Бесконечный цикл продолжается пока текущий токен равен TOK_ATTRIBUTE1 или TOK_ATTRIBUTE2 Вызывается next() и два раза skip() чтобы пропустить два '(' Пока текущий токен не станет равным ')', просходят следующие действия Токен не может быть заранее предопределенным иначе компилятор завершается с ошибкой. Вызывается next(), Если следующий токен TOK_SECTION1 или TOK_SECTION2, вызывается skip() чтобы пропустить '(', Если следующий токен не TOK_STR, то компиялтор зваершается с ошибкой. Текущий токен сохраняется во временной переменной. Вызывается next и запускается обработка сохраненного токена Для TOK_SECTION1 и TOK_SECTION2 В переданной структуре AttributeDef() обновляется поле section с помощью find_section(). Вызывается next() и затем skip(, чтобы пропустить ')' Для TOK_ALIGNED1 и TOK_ALIGNED2 Если текущий токен '(' происходят следующие дейсвтия Вызывается next() В переменную n записывается результат вызвоа expr_const() Если n принимает недопустимое занечение, компиялтор зваершается с ошибкой. Пропускается ')' Если текущий токен отличен от '(', n присваивается MAX_ALIGN В переданной структуре AttributeDef() обновляется поле aligned обновляется значением n Для TOK_PACKED1 и TOK_PACKED2: В переданной структуре AttributeDef() обновляется поле packed обновляется значением 1; Токеты TOK_UNUSED1, TOK_UNUSED2,TOK_NORETURN1 и TOK_NORETURN2 пропускаются Для токенов TOK_CDECL1, TOK_CDECL2, TOK_CDECL3 В переданной структуре AttributeDef() обновляется одно из полей связанной структуры func_attr значением FUNC_CDECL, для этого ссылка на поле func_call получается с помощью макроса FUNC_CALL Обработка TOK_STDCALL1, TOK_STDCALL2, TOK_STDCALL3 аналогична, но присваивается значение FUNC_STDCALL; Длч TOK_REGPARM1 и TOK_REGPARM2 Пропускается '(', вызывается expr_const(). Возвращенное значение проверяется на допустимые границы. Если итоговое значение больше нуля обноляется тоже поле что и на предыдущем шаге. Перед записью от итогового значения отнимается 1 и прибавляется FUNC_FASTCALL1. Пропускается ')' Для TOK_FASTCALL1, TOK_FASTCALL2 и TOK_FASTCALL3 обновялется тоже поле значем FUNC_FASTCALLW Для TOK_DLLEXPORT, тоже обновляется значением 1 Для остальных токенов, если в состоянии компилятора включен флаг warn_unsupported, выводится предупреждение Подсчитывается количество '(' и ')'. Когда их количест выравнивается или текуший токен будет равен -1, бесконечный цикл прерывается. На каждом шаге бесконечного цикла вызывается next() Большой бесконечный цикл прерывается, если встречаетя токен отличный от ',' Дважды пропускается ')' Section *find_section(TCCState *s1,
1   ...   15   16   17   18   19   20   21   22   ...   38


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