Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pascal_Unkn.doc
Скачиваний:
8
Добавлен:
03.11.2018
Размер:
1.63 Mб
Скачать

Верхний уровень

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

Всякий раз, когда я начинаю новый проект, я всегда хочу сделать это в самом начале. На языке разработки программ (program design language - PDL) этот верхний уровень походит на что-нибудь вроде:

     begin

       solve the problem

     end

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

В нашем случае, общая функция компилятора заключается в компиляции законченной программы. С этого начинается любое определение языка, записанное в БНФ. На что походит верхний уровень БНФ? Хорошо, это немного зависит от транслируемого языка.

Давайте взглянем на Pascal.

Структура паскаля

Большинство книг по Pascal включают БНФ определение языка. Вот несколько первых строк одного из них:

     <program> ::= <program-header> <block> '.'

     <program-header> ::= PROGRAM <ident>

     <block> ::= <declarations> <statements>

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

Для ее трансляции мы начнем с новой копии Cradle. Так как мы возвращаемся к одно-символьным именам мы будем просто использовать "p" для обозначения "program".

К новой копии Cradle добавьте следующий код и вставьте обращение к нему из основной программы:

{--------------------------------------------------------------}

{ Parse and Translate A Program }

procedure Prog; var  Name: char; begin    Match('p');            { Handles program header part }    Name := GetName;    Prolog(Name);    Match('.');    Epilog(Name); end;

{--------------------------------------------------------------}

Процедуры Prolog и Epilog выполняют все, что необходимо для связи программы с операционной системой так чтобы она могла выполняться как программа. Само собой разумеется, эта часть будет очень ОС-зависима. Помните, что я выдаю код для 68000, работающий под ОС, которую я использую - SK*DOS. Я понимаю, что большинство из вас использует PC и вы предпочли бы увидеть что-нибудь другое, но я слишком далеко зашел, чтобы что-то сейчас менять!

В любом случае, SK*DOS особенно простая для общения операционная система. Вот код для Prolog и Epilog:

{--------------------------------------------------------------}

{ Write the Prolog }

procedure Prolog; begin    EmitLn('WARMST EQU $A01E'); end;

{--------------------------------------------------------------} { Write the Epilog }

procedure Epilog(Name: char); begin    EmitLn('DC WARMST');    EmitLn('END ' + Name); end;

{--------------------------------------------------------------}

Как обычно добавьте этот код и испытайте "компилятор". В настоящее время существует только одна допустимая входная последовательность:

     px. (где х - это любая одиночная буква, имя программы).

Хорошо, как обычно наша первая попытка не очень впечатляет, но я уверен к настоящему времени вы знаете, что дальше станет интересней. Есть одна важная вещь, которую следует отметить: на выходе получается работающая, законченная и выполнимая программа (по крайней мере после того, как она будет ассемблирована).

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]