|
компилятор ТСС. Tiny c compiler by Fabrice Bellard Описание алгоритмов
static inline Sym *struct_find(int v) Переданный код структуры проверяется на выход за гарницы заданных символов. Возвращается соответствующий элемент массива table_ident static void expr_type(CType *type) Глобальная переменная nocode_wanted сохраняется и обновляется значением 1. Вызывается gexpr() В аврес типа переданный в качестве параметра записывается тип связанный с vtop Вызывается vpop() Восстанавливается nocode_wanted static void asm_global_instr(void) Компилятор может быть собран без поддержки втроенного ассемблера. В этом случае при вызове функции компилятор завершается с ошибкой. static int is_compatible_types(CType *type1, CType *type2) Возвращается результа вызова compare_types(). В качестве последнего параметра передется 0 static int compare_types(CType *type1, CType *type2, int unqualified) В переменные t1, t2 записываются значения полей t перданных типов. В них оставляются только биты входящие в VT_TYPE Если передан не нулевой параметр в обоих переменных сбрасываются биты VT_CONSTANT и VT_VOLATILE Если переменные не равны, функция завершается, возвращая 0 Если первый тип кодирует VT_PTR, для обоих типов вызывается pointed_type(), а результаты сравниваются с помощью is_compatible_types() Если кодируется тип VT_STRUCT в типах сравниваются поля ref Если кодируется тип VT_FUNC, используется функция is_compatible_func() static inline CType *pointed_type(CType *type) В переданном CType по полю ref получаем символ и возвращаем занчение его поля type static int is_compatible_func(CType *type1, CType *type2) Ссылки на символы для обоих типов сохраняются во временных переменных. Для них вызываетя is_compatible_types() если она возвращает нулевой результат, функция завершается с тем же результатом Сравниваются поля func_call полученные FUNC_CALL. Если они не равны, функция завершается возвращая 0 Если поле c одного из символов кодирет FUNC_OLD, функция завершается возвращая 1 Если поле c одного из символов не равно тому же полю второго символа, функция завершается возвращая 0 Бесконечный цикл обходит символы, связанные по полю next. Если одна из цепочек прерывается, функция завершается возвращая 0 Для типов связанных с символами вызывается is_compatible_parameter_types() Если в конце обхода ссылка на второй символ окажется нулевой, функция завершается возвращая 0 Если ни одно из условий не сработае, функция завершается возвращая 1 static int is_compatible_parameter_types(CType *type1, CType *type2) Функция возвращает результат вызова compare_types(). Последний параметр 1. static void func_decl_list(Sym *func_sym) Начинается цикл. Он закончится если текущий токен станет '{', ';', ',' или TOK_EOF Вызывается parse_btype() если он возвращает ненулевое значение, компилятор завершается с ошибкой. Если биты вычесленного типа кодируют VT_ENUM или VT_STRUCT и при этом текущий токен равен ';', мы пропускаем этот шаг иначе начинается вложенный бесконечный цикл. Вызывается type_decl(), которя изменят содержимое переменнй v Начинается обход цепочки по полю next начиная с символа переданного в качестве параметра. У каждого символа проверяется поле v на равенство перенной v. Если значения равны происходит переход на метку found Если в процессе обхода символ не будет, компилятор завершается с ошибкой. Если поле t типа содержит VT_STORAGE, компилятор завершается с ошибкой. Для типа вызывается convert_parameter_type() Тип связанный с найденным символом обновляется вычисленным типом Если текущий символ равен ',', вызывается next() иначе бесконечный цикл прерывается. Пропускается ';' static inline Sym *sym_find(int v) Переданный код символа проверяется на выход за границы заданных символов. Возвращается соответствующий элемент массива table_ident static Sym *global_identifier_push(int v, |
|
|