Функция возвращает r void gen_op(int op) В переменную t1 сохраняется значения поля t структуры CType связанной с предпоследней структурой SValue цепочки vtop В переменную t2 сохраняется значения поля t структуры CType связанной с последней структурой SValue цепочки vtop В переменные bt1 и bt2 записываются биты предидущих значений входящие в маску VT_BTYPE Если bt1 или bt2 равны VT_PTR происходит следующая обработка: Если код переданной операции больше или равен TOK_ULT и меньше или равен TOK_LOR, то в t записываеются биты VT_INT и VT_UNSIGNED, происходит переход на метку std_op Если bt1 и bt2 равны VT_PTR происходит следующая обработка: Если переданная операция отлична от '-', компилятор завершается ошибкой. Вызывается check_comparison_pointer_types(vtop - 1, vtop, op); Переменная u обновляется вызовом pointed_size() Вызывается gen_opic() В поея t структуры CType записывается VT_INT Вызываетя vpushi() и gen_op(); Если bt1 или bt2 неравны VT_PTR, происходит следующая обработка: Если переднная операция отлична от '-' и от '+', компилятор завершается ошибкой. Если bt2 равна VT_PTR, вызывается vswap() и swap(); CType связанной с предпоследней структурой SValue цепочки vtop сохраняется во временную переменную Вызывается vpushi() и gen_op() Вызывается gen_opic() CType связанной с последней структурой SValue цепочки vtop обновляется сохраненным значением Если bt1 или bt2 не равны VT_PTR, но проверка любой из этих переменных с помощью is_float() возвращает ненулевое значение, происходит следующая обработка: Если bt1 или bt2 содержат VT_LDOUBLE, переменной t присваивается VT_LDOUBLE Если bt1 или bt2 содержаб VT_DOUBLE, переменной t присваивается VT_DOUBLE Если ни одна из двух предидущи проверок не сработала, переменной t присваивается VT_FLOAT Если преданная операция не равна '+', '-', '*' или '/' или же она меньше TOK_ULT или больше TOK_GT, компилятор завершается ошибкой Происходит переход на метку std_op Если bt1 или bt2 содержат VT_LLONG, переменной t присваивается VT_LLONG. Дополнительно проверяется и при необходимости выставляется бит VT_UNSIGNED Происходит переход на метку std_op Если ни одна из проверок bt1 и bt2 не сработала, переменной t присваивает ся VT_LLONG Дополнительно проверяется и при необходимости выставляется бит VT_UNSIGNED С метки std_op, начинается следующая обработка: |