static int parse_btype(CType *type, AttributeDef *ad) Бесконечный цикл обрабатывает с помощью switch текущие токены. TOK_EXTENSION игнорируется, т. е. осуществляется переход к следющему токену с помощью next() Для TOK_CHAR переменной, содержащей верменный результат присваивается VT_BYTE. Далее идут две метки которые используются позже; basic_type по ней вызывается next() и basic_type1 по ней проверяется не является ли результирующий тип базовым (проверятся по маске VT_BTYPE. Если является компилятор завершается с ошибкой. В оконьчательный результа добавляются биты верменного. Устанавливается флаг typespec_found. Для токена TOK_VOID устанавливается временный результат VT_VOID и происходит переход на basic_type. Для токена TOK_SHORT устанавливается временный результат VT_SHORT и происходит переход на basic_type. Для токена TOK_INT вызывается next() и устанавливается флаг typespec_found. Для токена TOK_LONG вызывается next(), если в итоговом типе установлен байт VT_DOUBLE, то он сбарсыватеся вместе с остальными битами базовых типов и устанавливается бит VT_LDOUBLE. Если это услвие не сработало, проверяется установлен ли бит VT_LONG, если да он сбрасывается, то он сбарсыватеся вместе с остальными битами базовых типов и устанавливается VT_LLONG. Если ни одно из двух перечисленных условий не сработало, устанавливается VT_LONG и происходит переход на basic_type1 Для токена TOK_BOOL устанавливается временный результат VT_BOOL и происходит Для токена TOK_FLOAT устанавливается временный результат VT_FLOAT и происходит переход на basic_type.переход на basic_type. Для токена TOK_DOUBLE вызывается next(), если в итоговом типе установлен байт VT_LONG, то он сбарсыватеся вместе с остальными битами базовых типов и устанавливается бит VT_LDOUBLE Если это услвие не сработало Если ни одно из двух перечисленных условий не сработало, устанавливается VT_DOUBLE и происходит переход на basic_type1 Для TOK_ENUM вызывается struct_decl() которая заполняет временный CType. Далее идет метка basic_type2 по ней временный результа обновлется значением поля t временного CType. Ссылка на символ итогового CType обновляется ссылкой временного. Происходит переход на basic_type1 Для TOK_STRUCT и TOK_UNION вызывается struct_decl() которая заполняет временный CType. Происходит переход на basic_type2 Для TOK_CONST1, TOK_CONST2 и TOK_CONST3 в итоговом типе устанавливается бит VT_CONSTANT и вызывается next(); Для TOK_VOLATILE1, TOK_VOLATILE2 и TOK_VOLATILE3 в итоговом типе устанавливается бит VT_VOLATILE и вызывается next(); Для TOK_SIGNED1 TOK_SIGNED2 TOK_SIGNED3 устанавливается флаг typespec_found, в итоговом типе устанавливается бит VT_VOLATILE и вызывается next(); Для TOK_REGISTER, TOK_AUTO, TOK_RESTRICT1, TOK_RESTRICT2 и TOK_RESTRICT3 просто вызывается next(); Для TOK_UNSIGNED устанавливается флаг typespec_found, в итоговом типе устанавливается бит VT_UNSIGNED и вызывается next(); Для TOK_EXTERN в итоговом типе устанавливается бит VT_EXTERN и вызывается next() Для TOK_STATIC в итоговом типе устанавливается бит VT_STATIC и вызывается next() Для TOK_TYPEDEF в итоговом типе устанавливается бит VT_TYPEDEF и вызывается next() Для TOK_ATTRIBUTE1 и TOK_ATTRIBUTE2 вызывается parse_attribute() Для TOK_TYPEDEF в итоговом типе устанавливаетсябитVT_TYPEDEFи вызываетсяnext() Для TOK_TYPEOF1, TOK_TYPEOF2 и TOK_TYPEOF3, вызывается next() и parse_expr_type(), присходит переход на basic_type2 Действия по умолчанию: Если установлены флаги typespec_found или typedef_found происходит переход на метку the_end. Присходит поиск символа для текущего токена с помощью sym_find() Елси символ не найден или поле t связанного с ним CType при побитовом И с VT_TYPEDEF. дает нулевое значение, происходит переход на метку the_end. Устанавливается флаг typedef_found. К битам итогового типа добавляются биты поля t связанного с ним CType. Перед этим в поле обнуляются все биты входящие в маску VT_TYPEDEF. Ссылка на символ итогового CType обновляется ссылкой CType связанного с найденным символом. Устанавливается флаг typespec_found. Устанавливается флаг type_found. Начиная с метки the_end присходят следующие действия Если в итоговом типе одновременно присутствую биты VT_SIGNED и VT_UNSIGNED, компилятор завершается с ошибкой. Если в глобальном состоянии компилятора установлен флаг char_is_unsigned, то при установленном бите VT_BYTE и не установленных VT_SIGNED и VT_UNSIGNED добавляется бит VT_UNSIGNED Сбрасывается бит VT_SIGNED Если побитовое И с маской VT_BTYPE дает VT_LONG, то все биты по макске VT_BTYPE сбрасываются и устанавливается VT_INT; Итоговый тип записывается в поле итогового CType. Функция возвращает type_found в качестве результата. |