Министерство образования Российской Федерации Государственное образовательное учреждение высшего профессионального образ...
9 downloads
167 Views
434KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Министерство образования Российской Федерации Государственное образовательное учреждение высшего профессионального образования
СЕВЕРО-ЗАПАДНЫЙ ГОСУДАРСТВЕННЫЙ ЗАОЧНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра компьютерных технологий и программного обеспечения
ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ
Методические указания к выполнению практических занятий
Факультет информатики и систем управления Направление и специальность подготовки дипломированного специалиста: 654600 - информатика и вычислительная техника 220100 - вычислительные машины, комплексы, системы и сети
Санкт-Петербург 2003
Утверждено редакционно-издательским советом университета УДК 681.3.06 Теория языков программирования и методы трансляции: Методические указания к выполнению практических занятий. – СПб.: СЗТУ, 2003 - 36 с. Методические указания составлены в соответствии с требованиями государственного образовательного стандарта высшего профессионального образования по направлению подготовки дипломированного специалиста 654600 (специальность 220100 – «Вычислительные машины, комплексы, системы и сети») для дисциплины специализации (ДС) «Теория языков программирования и методы трансляции».
Практические занятия предназначены для углубленного изучения приемов программирования на языке С++ и приобретения практических навыков в разработке интерпретаторов. В задании на проектирование интерпретатора предложен простейший язык Small BASIC. В процессе выполнения практических заданий студенты должны познакомиться с алгоритмизацией построения анализатора выражений и интерпретатора команд. Рассмотрено на заседании кафедры компьютерных технологий и программного обеспечения (КТ и ПО) 9.06.2003 г., одобрено методической комиссией факультета информатики и систем управления (ФИСУ) 17.11.2003.
Рецензенты: кафедра прикладной и компьютерной оптики СПбГИТМО (О.В.Багдасарова, канд.техн.наук., доц.); кафедра компьютерных технологий и программного обеспечения (Г.И.Анкудинов, д-р.техн.наук, проф.) Составители: М.В. Копейкин, канд.техн.наук, доц.; Н.В. Рачева, доц.,; Е.О. Шумова, доц. © Северо-Западный государственный заочный технический университет, 2003
ВВЕДЕНИЕ Цель практических занятий - углубление знаний в алгоритмизации и приемах программирования на языке С++, получение практических навыков в проектировании сложнейших программных продуктов. Основные требования данной специальной дисциплины – ознакомиться на практике со следующими вопросами: Профессиональное программирование на языке С++. Создание файла проекта в интегрированной среде Borland С++. Изучить правила описания внешних переменных и использования рекурсивных функций. Синтаксический анализ выражений. Изучить принципы построения рекурсивно-нисходящего алгоритма, ознакомиться с продукционными правилами разбора выражений и получить навыки в программировании процедур для простых алгебраических выражений. Интерпретатор языковых команд. Изучить возможности и принципы построения интерпретирующей системы и получить навыки в программировании простейших команд интерпретатора. 1. Задания на выполнение практических занятий 1.1. Общие указания к выполнению заданий на практических занятиях
Методические указания предназначены для студентов заочной и очно-заочной форм обучения как в дисплейном классе, так и в домашних условиях. Результаты выполненных заданий должны быть продемонстрированы преподавателю в дисплейном классе во время, выделенное на практические занятия. В случае самостоятельного выполнения обязательно представить отчеты в виде печатанного текста, где должны быть задание, выбранное по последней цифре студенческого шифра, исходные тексты программных модулей на языке С++ с соответствующими комментариями и приведены протоколы тестирования. Работа № 1 Создание файла проекта в интегрированной среде Borland С++. I. Цель работы. Изучить принципы многофайловой компиляции. Создать файлы с расширением *.prj и *.exe. II. Порядок выполнения работы.
В главном верхнем меню интегрированной среды BC++ найти надпись project. Выбрать имя проекта, установить режим add и занести для компиляции имена двух файлов (исходные тексты анализатора выражений и интерпретатора команд взять с сайта http://www.de.nwpi.ru/). Запустить на трансляцию. Полученный файл с расширением *.exe проверить на выполнение. Для проверки составить исходный текст на Small BASIC в 7-10 строк. Вариант задания может быть составлен индивидуально, либо выбрать по последней цифре шифра из таблиц 1 и 2. Убедиться в правильности исполнения программы на Small BASIC и зафиксировать протокол. Работа № 2 Расширение списка команд Small BASIC. I. Цель работы. Добавить два простейших оператора: очистка экрана и пауза. II. Порядок выполнения работы. Разобраться с заданием №2. Исходный текст интерпретатора изучить по исполняемым функциям. Предложить самостоятельно имена (аббревиатуры) операторов. Задать синтаксис конструкций по примеру уже имеющихся семи операторов. Написать для реализации предложенных команд функции на языке BC++. Для общих занятий в дисплейном классе вариант задания выбирается наиболее простой. Рекомендуется реализовать команды очистки экрана и установки паузы. Для самостоятельной работы можно взять и более сложные команды, например, реализовать оператор цикла с неизвестным количеством повторов. После внесения изменений в текст интерпретатора команд повторить процесс отладки и тестирования. Работа № 3 Построение рекурсивных функций на языке С++. I. Цель работы. Изучить принципы построения рекурсивных функций на примерах, работающих программ. Написать самостоятельно функцию для построения двоичного дерева или быстрой сортировки одномерного массива. II. Порядок выполнения работы. Изучить раздел «алгоритмы построения рекурсивных функций». Ознакомиться с примером программы, реализующей работу калькулятора. Написать предложенные алгоритмы на языке С++. Провести тестирование
на двух-трех примерах. Протокол преподавателю по окончанию занятий.
зафиксировать
и
предъявить
1.2. Задание на практические занятия Задание 1: составить примеры исходных текстов для языка Small BASIC для решения простой задачи. Задача: вычислить А для всех Х от 1 до 5, ⎧ , Х < 3 А= ⎨ ⎩ , Х ≥ 3 Таблица 1 Последняя цифра шифра 0 1 2 3 4 5 6 7 8 9
Выражение 1 Х+5 Х-1 Х*2 10-Х Х/2+5 20-Х*2 Х+7 Х/2+10 Х*2-8 11-Х*2 Таблица 2
Последняя цифра шифра 0 1 2 3 4 5 6 7 8 9
Выражение 2 Х*2 Х*3 Х-2 10-Х 15-Х 20-Х/2 Х*2+5 9-Х*2 8+Х 11-Х
Задание 2: в исходном тексте интерпретатора в функцию под именем tokens добавить к перечисленным ранее командам аббревиатуры (идентификаторы) команд очистки экрана и паузы, а также указать эти команды в таблице commands и в операторе switch главного цикла программы. Не забыть, главное, написать соответствующие функции для обработки данных команд. Задание 3: изучить исходные тексты (размещены ниже) программных модулей, написанных на языке Паскаль, понять алгоритмизацию предложенных задач и реализовать заданные задачи на С++ для закрепления знаний по рекурсивным функциям. { Метод быстpой сортировки } procedure qwick(var b:vec); procedure sortqwick(kl,kr:integer; var u:vec); { sortqwick - рекурсивная процедура } Var { раздел описания переменных} r,v:real; ir,il:integer; { kl,kr - первый и последний элемент текущей группы } Begin ir:=kr; il:=kl; r:=u[(kr+kl) div 2]; repeat while u[il] < r do il:=il+1; while r < u[ir] do ir:=ir-1; if ilir; { repeat – until подобен оператору цикла на С++ do-while } if kli.target) return; fpush(i); prog=i.loc; }
Следует отметить, использование предусмотрено в теле цикла.
оператора
GOTO
не
2.2.8. Оператор построения подпрограмм Язык Small BASIC не поддерживает отдельные подпрограммы, но с помощью оператора GOSUB и RETURN реализована возможность вызова отдельных частей программы. GOSUB < номер строки > . . тело подпрограммы . . RETURN Обращение GOSUB требует использования стека. Каждому RETURN соответствует единственный GOSUB. char *gstack[SUB_NEST]; int gtos; /* Операция обращения к заданной строке и возврат назад */ void gosub() { char *loc; get_token(); /* */ loc=find_label(token); if (loc=='\0') serror(7); else { gpush(prog); prog=loc; } } /* Операция возврата к заданной строке */ void greturn() {
prog=gpop(); } /* Результат в стек gosub*/ void gpush(s) char *s; { gtos++; if (gtos==SUB_NEST) { serror(12); return; } gstack[gtos]=s; } /* Проверка уровня вложенности gosub*/ char *gpop() { if (gtos==0) { serror(13); return; } (gstack[gtos--]); } Значение prog помещается в стек GOSUB, адрес строки, с которой начинается подпрограмма, помещается в prog. Когда встречается RETURN, из стека GOSUB извлекается очередное значение и присваивается prog. Оператор допускает вложенность GOSUB. Полный текст интерпретатора размещен на сайте www.de.nwpi.ru. 2.3. Тестирование В качестве тестов предлагаются простейшие программы, использующие языковые конструкции, заложенные для Small BASIC. Далее приведены примеры исходных текстов на языке Small BASIC с использованием GOSUB и протоколы выполнения программ. Протоколы демонстрируют процесс выполнения программы и правильность реализации простых вычислений.
Тест 1 PRINT "Команды ввода-вывода" PRINT " O'K " INPUT "H=",H IF H10 THEN PRINT "O'K A>10" PRINT “A=”;A PRINT “A+5=”;A+5 INPUT " H=",H PRINT “Ввели значение H=”;H INPUT "Это тест Y=";Y PRINT “ H+Y=”;H+Y IF A10 A=27 A+5=32 H=5 Ввели значение H=5 Это тест Y=9 H+Y=14 Тест выполнен Протокол 2 Команды ввода-вывода О'К Н=7 О'К A>10 A=22 A+5=27
H=12 Это тест Y=1 H+Y=13 Тест выполнен Протокол 3 Команды ввода-вывода О'К Н=25 H>=22 (H-10)*2 Результат=24 H/2=12 О'К A>10 A=40 A+5=45 H=1 Это тест Y=1 H+Y=2 Это подпрограмма А #include <math.h> #include <stdlib.h> #define false 0 #define true 1 // NextChar - для ввода значений int NextChar; int cont=true; // Прототипы float Factor(); float Term(); float Expression(); // void GetNextChar() { while ((NextChar = getchar()) == ' '); } // рекурсивная функция float Factor() // { float v=0; int count=0; int i; int d_p=false; // if ((NextChar>='0') && (NextChar='0') && (NextChar