Курсовая работа по системному программному обеспечению

Задание

Разработать, отладить и документировать транслятор для заданного входного языка в соответствии с вариантом задания.

Вариант задания – 7:

  1. Дополнительный тип данных:
    1. глобальный одномерный массив;
    2. указатель.
  2. Дополнительные операции: [ ].
  3. Дополнительные операторы: цикл с постусловием do оператор while (выражение).
  4. Тип комментария: комментарий в круглых скобках со звездочкой: (* … *).

Описание транслятора C0

Общие сведения о трансляторе С0

Транслятор С0 переводит исходную программу с языка С0 на язык ассемблера IBM PC. Таким образом, использование языка ассемблера в качестве объектного языка делает его однопроходным и более удобным в понимании основных методов трансляции, избежав многочисленных деталей генерации машинного кода.

Транслятор написан на языке С и состоит из 18 подпрограмм, которые используют около 30 глобальных переменных.

Трансляция выражений в С0 производиться методом стека с приоритетом. Остальные конструкции языка (операторы и описания) транслируются методом рекурсивного спуска.

Возможности языка С0

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

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

Имеются следующие операторы: оператор-выражение, составной оператор, сокращённый условный оператор, цикл с предусловием, оператор возврата.

В выражениях допускаются:

  • арифметические операции: +, -, *, /, %;
  • сравнения: ==, !=, <, >, <=, >=;
  • присваивание: =;
  • скобки: ( ).

Отсутствующие в языке С0 логические операции И и ИЛИ можно заменить * или + соответственно.

Также существуют некоторые ограничения:

  1. Служебные слова пишутся строчными буквами.
  2. Длина имени не ограничена, но учитываются не более 8 символов.
  3. Отсутствующий оператор return в конце описания функции вставляется автоматически.

Грамматика языка С0

программа                       ::=    {описание-переменных [ описание-функции ]}…

описание-переменных     ::=     int имя [,имя]…;

описание-функции          ::=     имя ( [имя[,имя]…] ) | { [описание-переменных]…[оператор]… }

оператор      ::=  [выражение]; | { [оператор]… } | if (выражение) оператор | return  [выражение]; | while (выражение) оператор

выражение    ::=   терм [{+|-|*|/|%|<|>|<=|>=|==|!=|=}терм]…

терм               ::=   число | имя | имя ([выражение[,выражение]…]) |

— терм | (выражение)

имя                 ::= буква [буква|цифра]…

число              ::= цифра …

буква              ::=          A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z

a|b|c|d|e|f |g|h|i|j|y|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z

цифра             ::=   0|1|2|3|4|5|6|7|8|9

Эта грамматика описывает синтаксис и лексику языка СО. К лексике относятся четыре последних правила.

Использование компилятора С0

Для трансляции и выполнения С0-программы используется следующая последовательность команд MS DOS:

с0.exe                                                                 трансляция

masm p.asm                                                      ассемблирование

tlink p.obj                                                           компоновка

p.exe                                                                    выполнение

Компилятор С0 вводит исходную программу из файла p.c0, помещая результат трансляции на языке ассемблера в файл p.asm. Затем производятся ассемблирование, компоновка (редактирование связей) и выполнение программы. Объектный и исполняемый модули транслируемой программы обычно получаются в файлах p.asm и p.exe.

Сообщения об ошибках

Сообщения об ошибках в исходной программе также вставляются компилятором С0 в объектный код в виде строк комментария, содержащего номер (тип) ошибки и символ “^”, указывающий на текущую позицию предшествующей исходной строки в момент обнаружения ошибки. В конце объектной программы вставляется итоговое сообщение о количестве обнаруженных ошибок, дублируемое на экране.

Далее приведён перечень сообщений об ошибках (номер указывает на номер (тип) ошибки):

  1. Число больше 32767
  2. Слишком много имен
  3. Требуется int или имя функции
  4. Многократно описанное имя
  5. Требуется ‘(‘
  6. Требуется имя
  7. Требуется ‘)’
  8. Не удалось открыть входной или выходной файл
  9. Недопустимый символ
  10. Требуется ‘,’
  11. Требуется ‘{‘
  12. Требуется ‘;’
  13. Требуется ‘}’
  14. Имя не описано
  15. Неверный ограничитель в выpажении
  16. Неверный тип операнда выpажения
  17. Несоответствующие типы операндов
  18. Неверный тип левого операнда пpисваивания
  19. Нет имени функции
  20. Неверный вызов функции
  21. Деление на ноль

Далее указаны новые сообщения об ошибках, которые были введены в процессе доработки функционала:

  1. Не указано количество элементов в массиве
  2. Требуется ‘]’
  3. Требуется ‘*)’
  4. Требуется while

Описание новых возможностей языка С0

Тип данных: глобальный одномерный массив

Входной язык С0 является подмножеством языка С. В оригинальной версии транслятора входной язык С0 содержал данные только  целочисленного типа, однако в рамках курсовой работы была добавлена поддержка глобальных массивов. При выборке элемента массива, индекс элемента массива, рассчитывается с помощью функции вычисления выражения, значение которого помещается в стек. Изменения генерации объектного кода при выборке элемента массива, касаются лишь определения адреса переменной:

POP  SI      ;выбрать из стека вычисленное выражение-индекс массива

SHL  SI,1   ;умножаем на два, получаем смещение в байтах

Тип данных: указатель

Также в рамках курсовой работы была добавлена поддержка указателей и адресов, поскольку только указателей для работы мало. Работа с адресами реализована средствами ассемблера:

LEA AX,_имя     ;поместить адрес переменной в AX

MOV AX,[BX]    ;запись значения в BX по адресу AX

Синтаксис операций в C0:

adr=&var;  — запись адреса var в adr

znach=#adr;         — запись значения в znach по адресу adr (равносильно znach=var)

Дополнительные операции: [  ]

Для работы с элементами массива также была добавлена операция выборки элемента массива «[ ]». Во всех операциях, реализованных в трансляторе С0, для использования элемента массива, вставляется объектный код, а адрес элемента генерируется псевдокомандой:

_имя [SI]

Например:

MOV AX,_имя[SI]        ;заносит элемент массива в регистр AX

Условный оператор: do оператор while (выражение)

Цикл с постусловием, также как и уже имеющийся в трансляторе С0 цикл с предусловием, используется для организации повторяющихся действий:

do оператор while (выражение);

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

{ оператор_1 … оператор_n }

Эти скобки превращают последовательность операторов в один составной оператор.

Грамматика С0 была изменена следующим образом:

Оператор::=[выражение]; | {[оператор]…} | if (выражение) оператор | while (выражение) оператор | return  [выражение]; | do оператор while(выражение);

Тип комментария: (*…*)

Любые символы, помещенные между комбинацией (* и *) не учитываются при компиляции. Комментарии можно вставлять в любом месте строки, однако комментарии не должны разбивать лексемы. При трансляции, вся комментируемая строка вместе с комбинациями символов комментария заменяется пробелом. Т.о. любая лексема, разбитая комментарием, будет разбита пробелом на две лексемы.

Загрузки

Отчет по курсовой

Исходные коды оригинального C0

Исходные коды измененного C0

Компилятор ассемблера

Запись опубликована в рубрике Программирование, С с метками , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *