Лекция: Общие сведения о компиляторе С0

Компилятор С0 переводит исходную программу с языка С0 на язык ассемблера IBM PC. Выбор языка ассемблера в качестве объектного языка позволил максимально упростить компилятор, сделать его однопроходным и более понятным, избежав многочисленных технических деталей генерации машинного кода. Компилятор получился простым и обозримым (всего лишь около 700 строк на языке C). В то же время, несмотря на предельную простоту, язык C0 оказался пригодным даже для практических задач.

Компилятор написан на языке C и состоит из 18 подпрограмм (функций), использующих около 30 глобальных переменных.

Таблица имен. Основной глобальной структурой данных компилятора СО является таблица имен транслируемой программы, каждый элемент которой состоит из трех полей: имя, вид именуемого объекта (переменная/ функция) и смещение в кадре стека (для локальных переменных и параметров). Таблица имеет двухуровневую структуру (глобальные имена и локальные имена текущей транслируемой функции) и представляет собой стек в виде массива tabim из четырех частей, границы индексов Рис. 1. Структура таблицы имен

которых задаются глобальными переменными: kolglb — количество глобальных имен; kolim — общее количество имен и kpar — количество имен после включения параметров (см. рис. 1).

После трансляции описания текущей функции определенные в ней имена удаляются из таблицы (kolim становится равным kolglb). В глобальную часть таблицы заносятся имена глобальных переменных, определенных между описаниями функций, и имя следующей функции. Затем в таблицу заносятся имена формальных параметров и локальных переменных этой функции, после чего определяются их смещения в кадре стека.

Поиск и включение имен в таблицу выполняют подпрограммы pozic и vkluсh.

Синтаксический и семантический анализ.Трансляция выражений в С0 производится методом стека с приоритетами. Остальные конструкции языка (операторы и описания) транслируются методом рекурсивного спуска [1, 2, 6]. Любым из этих методов можно было бы транслировать всю программу.

Конструкцию «программа» языка С0 анализирует главная программа компилятора main, «описание (определение) функции» — подпрограмма oprfun, «описание переменных» — opisper, «оператор» — operatr, «выражение» — virag.

Последовательность операторов вида "[оператор] .. .}", встречающаяся в описании функции и составном операторе, анализируется подпрограммой poslop. Синтаксические программы main, opisper, poslop, operatr, virag являются в то же время и семантическими программами, т. к. генерируют объектный код для своих конструкций.

Подпрограмма operatr соответствует рекурсивному правилу грамматики С0 для конструкции «оператор» (внутри оператора может находиться другой оператор) и поэтому сама является рекурсивной. Это обеспечивает трансляцию многоуровневых вложений составных и условных операторов и циклов.

Структура синтаксической программы (кроме virag) практически однозначно определяется структурой соответствующего правила грамматики.

Лексический анализ в трансляторе С0.Программа сhleks читает очередную лексему входного текста и присваивает ее значение глобальной переменной leksema, используя для чтения очередного символа подпрограмму chsim.

Подпрограмма чтения символа chsim вводит исходный текст строками длиной до 80 символов. Это делается для того, чтобы после ввода строки можно было бы сразу же вставить ее в виде комментария в объектную программу. В вызывающую программу передается сначала первый символ текущей строки, а затем (при последующих вызовах) — остальные ее символы (по одному). После исходной строки в объектную программу вставляются команды, полученные в процессе чтения и трансляции этой строки, а также сообщения об обнаруженных в ней ошибках. При посимвольном вводе входного текста этого сделать бы не удалось.

Диагностика и нейтрализация ошибок.Диагностика и нейтрализация ошибок требуется не только транслятору, но и любой программе. При обнаружении ошибки необходимо сообщить о ней. Дальнейшие действия программы могут быть различными.

Самое простое — прекратить работу, но это не всегда приемлемо. По возможности желательно продолжить работу, хотя бы для обнаружения остальных ошибок. Тогда необходимо как-то нейтрализовать («исправить») ошибку, исходя из наиболее вероятного предположения о характере ошибки.

В большинстве случаев это предположение оправдывается и программа будет действовать разумно, однако всегда возможны другие варианты ошибки, при которых действия программы будут выглядеть бессмысленными. Поэтому никогда не следует буквально воспринимать все сообщения программы об обнаруженных ошибках.

В компиляторе С0 подпрограмма oshibka (n) вставляет в выходной файл сообщение об ошибке типа n в виде строки с символом "^", расположенным в позиции текущего символа входной строки, и значением n.

еще рефераты
Еще работы по информатике