- •Министерство образования и науки российской федерации
- •Оглавление
- •3. Содержание отчета
- •4. Задание на курсовую работу
- •4.1. Пример перевода
- •5. Постановка задачи
- •6. Внешняя спецификация программы
- •6.1. Вход
- •6.2. Выход
- •6.3. Аномалии
- •7. Метод решения задачи
- •8. Описание алгоритма
- •8.1. Структура данных
- •8.2. Алгоритм главной программы
- •8.3. Выделение подпрограмм
- •8.4. Алгоритм подпрограммы обработки комментария (fcomment)
- •8.5. Алгоритм подпрограммы обработки оператора if (fif)
- •8.6. Обработка арифметического выражения
- •9. Структура программы
- •10. Синтаксические диаграммы арифметических и логических выражений
- •11. Пример программы мини-транслятора на Паскале
- •12. Варианты индивидуальных заданий
- •13. Библиографический список
- •109028 Москва, б. Трехсвятительский пер., 3/12.
- •113054 Москва, ул. М. Пионерская, 12.
8.3. Выделение подпрограмм
На основе анализа алгоритма главной программы выделяются основные подпрограммы и для каждой указывается её имя, например:
1. Обработка комментария – fcomment.
2. Обработка оператора с ключевым словом – fstatkey.
3. Обработка оператора присваивания – fassign.
4. Обработка ошибки – ferror.
Далее разрабатываются алгоритмы выделенных подпрограмм. Для каждой подпрограммы описываются исходные данные, результат и связь. На основе анализа алгоритмов могут выделяться новые подпрограммы.
Ниже предполагается, что каждая подпрограмма обработки оператора или его элемента оформлена в виде подпрограммы-функции и возвращает код ошибки ( 0 - при отсутствии ошибки). Исходными данными для каждой такой подпрограммы являются:
text1 |
одномерный массив символьных строк, содержащий текст конвертируемой программы; |
nstr1 |
номер строки массива text1, содержащей конвертируемый элемент; |
Npos1 |
номер первого символа конвертируемого элемента в текущей строке массива text1 ( для операторов - номер первого символа после ключевого слова ); |
nstr2 |
номер строки в массиве text2, в которую записывается результат конвертирования. |
Результатами работы подпрограммы являются:
text2 |
одномерный массив символьных строк, содержащий текст программы, полученный в результате конвертирования; |
nstr2 |
номер текущей строки массива text2; |
nstr1 |
номер текущей строки массива text1, содержащей символ, следующий за обработанным элементом; |
Npos1 |
номер символа в текущей строке массива text1,следующего за обработанным элементом; |
<имя подпрограммы> |
номер ошибки ( 0 - нет ошибки ). В случае ошибки осуществляется выход из подпрограммы и текущей строкой массива text1 становится строка, следующая за строкой с ошибкой. |
Приведённые ниже алгоритмы предполагают разработку мини-транслятора Паскаль-Си.
8.4. Алгоритм подпрограммы обработки комментария (fcomment)
Дано:
text1 |
одномерный массив символьных строк, содержащий текст конвертируемой программы; | |
text1 |
исходный текст; |
|
nstr1 |
номер строки массива text1, содержащей комментарий; | |
nstr2 |
номер текущей строки в массиве text2. |
Требуется получить:
text2 |
одномерный массив символьных строк, содержащий текст программы, в который внесен комментарий; |
nstr1 |
номер строки массива text1, следующей за строками комментария (если комментарий был размещен на одной строке, то nstr1 = nstr1 + 1); |
nstr2 |
номер текущей строки в массиве text2 (если комментарий размещён на одной строке, то nstr2 = nstr2 + 1). |
Связь:
Текст комментария, размещенный в массиве text1 между символами '{' и ‘}’ или '(*' и ‘*)’, переписывается в текущую строку массива text2 с добавлением в начало и конец скобок комментария /* и */, например:
text1 |
text2 |
{ текст комментария } |
/*текст комментария*/ |
(*еще один текст комментария *) |
/*еще один текст комментария */ |
Алгоритмfcomment
Запись в текущую строку text2 символов /*
Определение символов конца комментария в исходном тексте: '}' или '*)' в зависимости от символов начала комментария '{' или '*('
Копирование текста комментария из text1 в текущую строку text2 пока не встретятся символы конца комментария или не будет достигнут конец массива text1. При каждом переходе на следующую строку text1 происходит увеличение на 1 счётчика nstr1.
Если символы конца комментария не найдены, то печать диагностического сообщения и аварийное завершение программы.
Запись в text2 символов */
nstr2 := nstr2 + 1
fcomment := 0;
конец