Пример отчета по лабораторной работе 1



Задача

Подсчитать количество цифр в данном тексте, заканчивающемся клавишей Esc (код 27).

С0- программа                              Результаты работы

int z;                                                                   Тест от 9/10/08

main()                                                                 5

{ int c;

z=0;                                                            Кадр стека функции main

while ((c=getchar())!=27)                    ---------------------------------------

if (c>=48)                                     0 |  Адрес предыдущего кадра | 

if (c<=57) z=z+1;                       --------------------------------------

putchar(10);                                        У функции main адрес возврата

putchar(13);                                        отсутствует, т. к. она запускается

putn(z);                                               из ОС.

putchar(10);

}

Oбъектная программа (приведена не полностью)

ASSUME CS:_KOM,SS:_STEK,DS:_DAN _KOM SEGMENT

;int z;

;main()

_main PROC  FAR

MOV  AX,_DAN

MOV  DS,AX

MOV  AX,_STEK

MOV  SS,AX

LEA   SP,_DNOST

; int c;

SUB   SP,2

PUSH BP

MOV  BP,SP

; z=0;

MOV  AX,0

MOV  z,AX

; while ((c=getchar())!=27)

_CC1:

CALL _getchar

PUSH AX

POP AX

MOV 2[BP],AX

PUSH AX

MOV  BX,27

POP    AX

CMP   AX,BX

MOV  AX,1

JNE    _CC3

SUB   AX,AX

_CC3:

PUSH AX

. . .

; putn(z);

MOV  AX,z

PUSH AX

CALL _putn

; putchar(10);

MOV  AX,10

PUSH AX

CALL _putchar

;

POP    BP

ADD  SP,2

MOV  AH,4CH

INT    21H

_main ENDP

INCLUDE std.asm _KOM ENDS _STEK SEGMENT STACK

DW 100 DUP (?) _DNOST DW ?

_STEK ENDS

_DAN SEGMENT

z     DW        ?

_DAN ENDS

END _main

;Компилятоp С0 от 10/04/08:

;колич. ошибок 0


Лабораторная работа № 2

Транслятор языка С0

Цель работы - изучение методов трансляции на примере компилятора  C0.

Программа компилятора приведена в файле C0.c и приложении 3. Подпрограммы в ней расположены сверху вниз по иерархии подпрограмм. В приложении 2 подпрограммы перечислены по алфавиту с указанием их назначения и номеров строк текста, где они расположены.

Общие сведения о компиляторе С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.


Дата добавления: 2019-02-12; просмотров: 338; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!