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

компилятор ТСС. 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
страница20 из 38
1   ...   16   17   18   19   20   21   22   23   ...   38

const char *name) Функция проходит по массиву sections, связанному с переданным состоянием компилятра и сравнивает имя каждой секции с переданной строкой. Если совпадение найдено возвращается указатель на секцию. Если в процессе обхода секция не найдена возвращается результат вызова new_section() static void post_type(CType *type, AttributeDef *ad) Если текущий '(' и следующий за ним токен не '(', то начинается бесконечный цикл. В перемнной l, которя до цикла обнуляется ишется значение FUNC_OLD, ели его нет, вызывается parse_btype() и еще раз проверяется l. Здесь возможно аварийное завершение компилятора, либо l будет присвоено значение FUNC_OLD и будет произведен переход на метку old_proto. Переменной l присваивается FUNC_NEW Во временном типе в поле t проверяются биты кодирующие простые типы, если они кадирую VT_VOID и текущий токен равен ')', бесконечный цикл прерывается Вызывается type_decl() она изменяет значение переменной n Проверяюся те же байты и если они кодируют VT_VOID, компилятор завершается с ошибкой. Переменная arg_size увеличивается занечением возвращаемым функцией type_size(). Предварительно это значение делается кратным 3 Если l не равна FUNC_OLD начинается обработка так же омеченая меткой old_proto: Если текущий токен является заранее определенным , компилятор завершается с ошибкой. Переменная n обновляется значением текущего токена Поле t временного типа обновляетя значением VT_INT. Вызывается next() Вызывается convert_parameter_type(&pt); Вызывается sym_push() для переменной n и временного типа. Адрес указателя plast обновляется полученным началом цепочки. Значение по этому указателю обновляться следующим символом в цепочке. Если текущий токен равен ')', бесконечный цикл прерывается. Пропускаем ',' Если l содержит FUNC_NEW или TOK_DOTS, ей присваивается FUNC_ELLIPSIS, вызывается, next(), бесконечный цикл прерывается Если l содержит 0, ей присваивается FUNC_OLD; Пропускается ')' В переменной t1 сохраняется часть поля t переданного типа. Эта часть входит в маску VT_STORAGE; В поле t переданного типа сбрасываются биты VT_STORAGE и VT_CONSTANT; Вызывается post_type() FUNC_ARGS(ad->func_attr) = arg_size; В переданной структуре AttributeDef из связанной структуры func_attr мы получаем адрес поля func_args с помощью макроса FUNC_ARGS и записываем по этому адресу arg_size Вызывается sym_push() В найденом символе поле next обновляется адресом начала цепочки В переданном типе обновляется t значением t1 с установелнным битом VT_FUNC; Поле ref обновляется адресом найденного символа; Если вместо '(' текущий токен равен '[', то происходит селдующая обработка Вызывается next(); Переменной n присваивается -1 Если текущий токен отличен от ']', то значение n обновляется результатом вызова expr_const(). Он контролируется на возврат недопустимого значение Пропускается ']'. В переменной t1 сохраняется значение поля t переданного типа type с установленным битом VT_STORAGE; В поле t переданного типа сбрасывают биты входящие в

VT_STORAGE; Вызывается post_type(). Вызывается sym_push() для поиска символа. В переданном типе обновляется поле t значением переменной t1 с установленными битами VT_ARRAY и VT_PTR; Поле ref обновляется адресом найденного символа. static inline void convert_parameter_type(CType *pt) В поле t переданного типа сбрасываются биты VT_CONSTANT и VT_VOLATILE В том же поле сбрасываются биты VT_ARRAY; Если биты поля кодирующие простые типы кодируют VT_FUNC, вызывается mk_pointer()
1   ...   16   17   18   19   20   21   22   23   ...   38


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