Технология отладки модулей транслятора
Цель работы - получение навыков автономной отладки модулей многомодульной программы и разработки отладочных средств на примере расширения возможностей транслятора С0 из лабораторной работы 3.
Планирование отладки
План отладки программы составляется на основании ее модульной структуры [4]. Модульная структура изображается в виде схемы взаимодействия модулей [8], пример которой показан на рис. 1. Линии на этой схеме идут вниз от вызывающего модуля к вызываемым.
Для облегчения отладки перед тестированием программы в целом автономно отлаживают ее отдельные модули. Это упрощает поиск и устранение ошибок, позволяет более полно проверить модули и организовать их параллельное тестирование.
Для автономного тестирования модуля или группы модулей в общем случае требуется специальный драйвер и столько имитаторов, сколько модулей вызывается из тестируемого модуля или группы модулей.
Например, для отладки модуля G нужно собрать программу или программный проект в составе самого модуля G, написанного для него драйвера, а также имитаторов вызываемых из G модулей H и I (рис. 2).
На рис. 3 показана программа для совместного тестирования модулей G и H, включающая имитаторы вызываемых из них модулей I и J, а также драйвер модулей G и H, который может отличаться от драйвера для одного модуля G.
Драйвер – это отладочная программа (функция main на языке С), которая запускает тестируемые модули и создает необходимую обстановку для их автономной работы. Для выполнения отлаживаемых модулей в тестовом режиме работу всех вызываемых из этих модулей подпрограмм упрощенно воспроизводят их имитаторы.
|
|
Модульная структура компилятора С0 представлена не в виде схемы, а в форме таблицы, в которой перечислены все вызываемые подпрограммы каждого модуля (см. приложение 2). Отладку измененного компилятора С0 на примере реализации операций ++ и -- из работы 3 удобно проводить в два этапа.
1. Автономная отладка подпрограммы чтения лексемы chleks. Параллельно и независимо от этого - автономная отладка группы подпрограмм трансляции выражения: virag, operac, adrper, zopreg с использованной в них подпрограммой vitsk. Подпрограмму virag, хотя она и не изменялась, необходимо проверить, т. к. не исключена возможность, что ее надо было бы изменить. Кроме того, без нее трудно убедиться в правильности трансляции выражений с новыми операциями.
2. Затем необходимо тестировать транслятор целиком (комплексно), в том числе убедиться, что не нарушилась его работа на старых тестах (без операций ++ и --).
Разработка тестов
Для примера реализации операций ++ и -- из лабораторной работы 3 в качестве теста используем следующую последовательность выражений: ++x; y++; -x--; --y; x=-y+++5; x=++y+5; y=--x-5; x=y---5;
|
|
Переменная leksema относится к перечислимому типу tipleks и описана в строках 82 – 87 измененного компилятора С0 следующим образом:
82 enum tipleks /* тип лексемы: */
83 {osh,ident,chislo,plus,minus,umn,del,ost,ravn,neravn,men,bol,
84 mravn,bravn,lskob,pskob,zpt,tchzpt,uvel,umen,prisv,
85 flskob,fpskob,ifsl,intsl,retsl,whilesl};
86 enum tipleks leksema; /* текущая лексема */
В соответствии с этим описанием, тип enum tipleks содержит значения 0, 1, 2, …, обозначаемые именами: osh = 0, ident =1, chislo = 2, plus =3, minus = 4, umn = 5, del = 6, ost = 7, ravn = 8, neravn = 9, men = 10, bol = 11, mravn = 12, bravn= 13 , lskob = 14, pskob = 15, zpt = 16, tchzpt = 17, uvel = 18, umen = 19, prisv = 20, flskob = 21, fpskob = 22, ifsl = 23, intsl = 24, retsl = 25, whilesl = 26.
При чтении из файла p.c0 разработанного тестового текста
++x; y++; -x--; --y; x=-y+++5; x=++y+5; y=--x-5; x=y---5;
подпрограмма chleks должна выдавать следующую последовательность лексем (в числовой записи): 18, 1, 17, 1, 18, 17, 4, 1, 19, 17, 19, 1, 17, 1, 20, 4, 1, 18, 3, 2, 17, 1, 20, 18, 1, 3, 2, 17, 1, 20, 19, 1, 4, 2, 17, 1, 20, 1, 19, 4, 2, 17.
Если текст теста из файла p.c0 (в отсутствие подпрограммы chleks - в числовом виде) подавать в цикле по одному выражению в подпрограмму virag, то она вместе с подчиненными ей программами должна генерировать в файле p.asm следующий объектный код, условно считая x глобальной переменной, а y – локальной переменной со смещением 2 (записан в три колонки):
|
|
; ++x; INC WORD PTR 2[BP] MOV AX,x
INC x PUSH AX PUSH AX
MOV AX,x MOV BX,5 MOV BX,5
; y++; POP AX POP AX
MOV AX,2[BP] ADD AX,BX SUB AX,BX
INC WORD PTR 2[BP] PUSH AX PUSH AX
; -x--; POP AX POP AX
MOV AX,x MOV x,AX MOV 2[BP],AX
NEG AX ; x=++y+5; ; x=y---5;
PUSH AX INC WORD PTR 2[BP] MOV AX,2[BP]
POP AX MOV AX,2[BP] DEC WORD PTR 2[BP]
DEC x PUSH AX PUSH AX
; --y; MOV BX,5 MOV BX,5
DEC WORD PTR 2[BP] POP AX POP AX
MOV AX,2[BP] ADD AX,BX SUB AX,BX
; x=-y+++5; PUSH AX PUSH AX
MOV AX,2[BP] POP AX POP AX
NEG AX MOV x,AX MOV x,AX
PUSH AX ; y=--x-5;
POP AX DEC x
Дата добавления: 2019-02-12; просмотров: 225; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!