компилятор ТСС. Tiny c compiler by Fabrice Bellard Описание алгоритмов
Скачать 191.99 Kb.
|
case '.': мы проверяем с помощью isnum() не начинает ли точка число. Если да, обрабатываем tokcstr как в случае с числом. Если идут две точки подряд, то за ними должна идти и третья, иначе останавливаем компиляцию и выдаем ошибку. Когда встречаются три точки подряд, выставляем токен TOK_DOTS В обычной ситуации выставляем токен '.' case '\'': Если встечается апостроф или кавычка, сбрасываем флаг is_long. Во вновь созданный экземпляр структуры CString заносятся данные с помощью функции parse_pp_string() в tokcstr помещаются данные без экранирования с помщью. parse_escape_string(). Рассмотрим эти функции позже. Если строка ограницена символом '\'' 1) если флаг is_long сброшен, то длине символа (переменная char_size) присваивается единица, иначе она равна размеру типа nwchar_t tokcstr проверяется. Если строка с ASCII-символами пуста, компиляция останавливается, если в ней больше одного символа, то компиляция продолжатеся, но выводится предупреждение. tokc.i получит символ из tokcstr.data, но если флаг is_long сброшен, tokc.i = *(int8_t *) и токен TOK_CCHAR, а если установлен tokc.i = *(nwchar_t *) и токен TOK_LCHAR Если строка ограницена символом '\"' tokc.cstr присваивается адрес временной переменной tokcstr; Если флаг is_long сброшен, выставляется токен TOK_STR, если установлен TOK_LSTR. case '<': Если встерчается '<' 1) если сразу за ним '=', то выставляется токен TOK_LE 2) Если следующий символ '<', то проверяется еще один символ. Если это '=', выставляется TOK_A_SHL иначе TOK_SHL 3) Если два предыдущих условая не верны, выставляется TOK_LT case '>': Те же правила для токенов TOK_GE, TOK_A_SAR, TOK_SAR, TOK_GT case '&': Проверяется следующий символ, если '&', выставляется TOK_LAND, если '=', выставляется TOK_A_AND, иначе выставляется токен '&' case '|': Проверяется следующий символ, если '|', выставляется TOK_LOR, если '=' выставляется TOK_A_OR, иначе выставляется токен '|' case '+': Проверяется следующий символ, если '+', выставляется TOK_INC, если '=' выставляется TOK_A_ADD, иначе выставляется токен '+'; case '-': Проверяется следующий символ, '-', выставляется TOK_DEC, если '=' выставляется TOK_A_SUB, если '>' выставляется TOK_ARROW, иначе выставляется токен '-' PARSE2('!', '!', '=', TOK_NE) PARSE2('=', '=', '=', TOK_EQ) PARSE2('*', '*', '=', TOK_A_MUL) PARSE2('%', '%', '=', TOK_A_MOD) PARSE2('^', '^', '=', TOK_A_XOR) Эти строки описывают следующий алгоритм: если за '!' встерчается '=', то выставляется токен TOK_NE, иначе '!'. case '/': если за '/' следует ASCII-символ '*', вызывается parse_comment(p) и переход на метку redo_no_start. Если это '/', вызывается parse_line_comment(p) |