Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kurs_My2(+).doc
Скачиваний:
0
Добавлен:
22.11.2019
Размер:
260.1 Кб
Скачать

2. Внешний проект

Внешний проект представляет собой описание форматов входных и выходных данных. Программа будет реализовать преобразование входного файла написанного на Pascal’e в файл формата, который воспринимает Assembler. Синтаксические конструкции, используемые для преобразования входного файла в выходной, имеют вид, приведенный ниже.

Описание синтаксических конструкций входного языка

<программа>::=< описания > <основная программа>

<описания>::=< заголовок программы > <описание переменных >

< заголовок программы >::= PROGRAM <имя программы >

< описание переменных >::= VAR < описание переменной >

< описание переменной >::=<имя переменной>:<тип переменной> ; |

< описание переменной >

< тип переменной >::= INTEGER | BOOLEAN

< основная программа>::= < составной оператор> .

< составной оператор >::= BEGIN

< список операторов>

END;

< список операторов>::= < оператор >;

< список операторов>::= < оператор >; < список операторов>

< оператор >::= < оператор присваивания := > |

< оператор составной > |

< оператор пустой ; > |

< оператор FOR > |

< оператор READ > |

< оператор READLN > |

< оператор WRITE > |

< оператор WRITELN >

< оператор присваивания := > ::= < идентификатор> := <выражение>;

< идентификатор > ::= < имя переменной > | < имя массива> [<индекс массива>]

< индекс массива > ::= <константа> | < переменная >

< оператор составной > ::= BEGIN < список операторов > END;

< оператор пустой> ::= ;

< оператор IF> ::= IF (< условие >) THEN < список операторов >;

ELSE <список операторов>;

<оператор while>  while <логическое выражение> do <оператор>

<логическое выражение>  <арифметическое выражение> <оператор сравнения>

<арифметическое выражение>

< оператор READ> ::= READ (<идентификатор>) ;

< оператор READLN> ::= READLN (<идентификатор>) ;

< оператор WRITE> ::= WRITE (<идентификатор>) ;

< оператор WRITELN> ::= WRITELN (<идентификатор>) ;

< выражение > ::= <терм > + < выражение >|

<терм > - < выражение >|

<терм >

< терм> ::= <терм > * < фактор>|

<терм > / < фактор>|

<фактор >

< фактор> ::= <идентификатор > | ( < выражение > )

< условие > ::= < идентификатор > < операция сравнения > < идентификатор >

< операция сравнения > ::= < | > | = | <= | >= | <>

Описание синтаксических конструкций выходного языка

Преобразованная программа должна быть получена на языке Аssembler’а, подчиняясь правилам написания программ на этом языке.

Программа на выходе компилятора должна иметь следующий вид:

{Заголовок программы}

{Сегмент данных}

{Сегмент кода}

{Окончание программы}

{Процедуры Read, Write, Readln, Writeln}

Заголовок программы на Assembler'е имеет следующий вид:

. Model Small

. Stack 256

Сегмент данных описывается следующим образом:

.DATA

<имя переменной> <тип переменной> <начальное значение>

Описываются все переменные, используемые в программе (т.е. описанные в разделе описания).

Сегмент кода имеет следующий вид:

. CODE

Start:

mov Ax, @DATA

mov Ds, Ax

<операторы программы>

Окончание программы:

mov Ax,4C00h

int 21h

END Start

Процедуры Read, Write, Readln, Writeln при их использовании в программе можно дописывать в конец программы, которая получилась после компиляции, или можно создать библиотеку, состоящую из этих процедур и присоединять их к программе на Аssembler'е на этапе связывания.

Опишем данные на выходе для различных операторов, для которых необходимо разработать компилятор (оператор WHILE, оператор IF, пустой оператор, составной оператор, оператор присваивания).

Для оператора WHILE:

mov Ax,<идентификатор1>

mov Bx,<идентификатор2>

LoopLable

push Ax

push Bx

{ список операторов }

pop Bx

pop Ax

cmp Ax,Bx

j<обратное условие> LoopLable

Для оператора IF:

mov Ax, < идетификатор 1 > // Выполняем проверку условия

mov Bx, < идетификатор 2 > //

cmp Ax, Bx //

j<обратное условие> LabelElse//Если условие False, то переход на

//метку Else

{ список операторов} // Выполняем оператор если условие

// True

j LabelEndIf // Переход на конец If

LabelElse: // метка Else

{ список операторов}

LabelEndIf:

Для пустого оператора выходной код не генерируется.

Код для составного оператора генерируется для каждого из составляющих его операторов.

Оператор присваивания реализуется следующим образом:

{Вычисление правой части выражения}

{Помещение вычисленного выражения в стек}

{Сохранение значения помещенного в стек в переменной}

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