Технология отладки модулей транслятора



 

Цель работы - получение навыков автономной отладки модулей многомодульной программы и разработки отладочных средств на примере расширения возможностей транслятора С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; Мы поможем в написании вашей работы!

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






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