static Sym *sym_push(int v, CType *type, int r, int c) Функция проверяет установлен ли указать local_stack, если до, то работа ведется с ним, иначе с global_stack Вызывается sym_push2() чтобы добавить CType с переданными значениями. В CType связанном с вновь созданным символом обновляется поле ref А в самом символе поле r Если в переданном значении не установлен бит SYM_FIELD и идентификатор символа поуучаемый при побитовом И с маской SYM_STRUCT меньше чем SYM_FIRST_ANOM, происходят следующие действия: Получаем соответствующий TokenSym из table_ident[] Если идентификатор символа получаемый при побитовом И с маской SYM_STRUCT нулевой, будем работать с указателем ts->sym_struct иначе с ts->sym_identifier Этот указатель используется чтобы обновить поле prev_tok созаного символа. И по этому же адресу помещается сам символ. Функция возвращает указатель на созданный символ. static Sym *sym_push2(Sym **ps, int v, int t, int c) Функция вызывает sym_malloc() и заполняет все поля, устанавливает ссылки и возвращает указатель на созданный символ. static inline Sym *sym_malloc(void) Функция возвращает первый символ из цепочки sym_free_first и сдвигает его. Если цепочка пуста вызывается __sym_malloc() static Sym *__sym_malloc(void) С помощью tcc_malloc() выделяется место под цепочку символов в количестве SYM_POOL_NB Внутри созданного пространства создается цепочка заканчивающаяся нулевым указателем. char *get_tok_str(int v, CValue *cv) C помощью cstr_reset() и установоки полей подгатавилвается Cstring. Для токенов TOK_CINT, TOK_CUINT, TOK_CLLONG и TOK_CULLONG вызывается sprintf() с соответствующими параметрами Для TOK_CCHAR, TOK_LCHAR дополнительно добавляются '\'' и '\0' Для TOK_PPNUM в строку последовательно добавляются байты из data и завершающий '\0' Для TOK_STR, TOK_LSTR в начало добавляется '\"', в строку последовательно добавляются байты из data и завершающие '\"' и '\0'. В зависимости от типа add_char() на вход передается указатель на unsigned char или на nwchar_t Для TOK_LT и TOK_GT используется часть блока default. Если обрабатывается TOK_DOTS, TOK_A_SHL или TOK_A_SAR, функция завершается возвращая соответствующую строку. Для предопределенных символов происходит проход по tok_two_chars. Если третий с ASCII-символ из тройки свпадает с v, с строку добавляются первые два и завершающий '\0'. Функция завершается и возвращает buf Если совпадение не найдено то в строку добавляется сам ASCII-симсвол и завершающий '\0' Если v меньше счетчика tok_ident, возращается указатель str связанный с соответствующим элементом массива table_ident Есил v больше SYM_FIRST_ANOM в строке печатается идентификатор анонимного символа. По окончании блока case функция возвращает адрес буфера созданной CString static inline void cstr_ccat(CString *cstr, int ch) В CString увеличивается поле size, при необходимости вызывается cstr_realloc() В конец буфера добавляется переданный ASCII-символ. static void cstr_realloc(CString *cstr, |