Пример отчета по лабораторной работе 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!