Главная страница

компилятор ТСС. Tiny c compiler by Fabrice Bellard Описание алгоритмов


Скачать 191.99 Kb.
НазваниеTiny c compiler by Fabrice Bellard Описание алгоритмов
Анкоркомпилятор ТСС
Дата08.11.2019
Размер191.99 Kb.
Формат файлаodt
Имя файлаtcc book.odt
ТипДокументы
#94047
страница2 из 38
1   2   3   4   5   6   7   8   9   ...   38

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)
1   2   3   4   5   6   7   8   9   ...   38


написать администратору сайта