Разработка лабораторного практикума по курсу "Разработка трансляторов для языков программирования"

Система дистанционного обучения Distance Learning Belarus и лабораторный практикум курса "Разработка трансляторов для языков программирования", его перенос в интерактивную среду обучения. Описание работы программы и её взаимодействия с пользователями.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 03.11.2012
Размер файла 588,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

Учреждение образования Гомельский государственный университет им. Ф. СКОРИНЫ

Математический факультет

Кафедра математических проблем управления

Курсовая работа

Разработка лабораторного практикума по курсу «Разработка трансляторов для языков программирования»

Исполнитель студентка

группы ПМ-35 Певнева М.В.

Научный руководитель

ассистент Короткевич Л.И.

Гомель 2012

Реферат

Курсовая работа

Distance Learning Belarus, Internet, HTML, Delta, Active Server Pages, Structured Query Language.

Объектом исследования является система дистанционного обучения Distance Learning Belarus и лабораторный практикум по учебному курсу «Разработка трансляторов для языков программирования». Была поставлена цель переработки и адаптации лабораторного практикума и перенос его в систему дистанционного обучения. В результате проделанной работы была переработана лабораторная работа №1 и перенесена в систему дистанционного обучения. Вследствие, чего появилась возможность проводить выдачу заданий по лабораторной работе и их проверку без непосредственного участия преподавателя, что повышает эффективность и скорость работы и освобождает преподавателя от выполнения рутиной работы, оставляя за ним лишь контролирующую функцию.

Содержание

  • Реферат
  • Содержание
  • Введение
  • 1. Назначение и структура лабораторного практикума
    • 1.1 Назначение лабораторного практикума
    • 1.2 Структура лабораторного практикума
  • 2. Система дистанционного обучения
    • 2.1 Базовые концепции разработки приложений для Интернет
    • 2.2 Основы языка HTML
    • 2.3 Структура системы дистанционного обучения
      • 2.3.1 Web-сайт
      • 2.3.2 Файловая структура
      • 2.3.3 Основная проверяющая программа и проверяющие модули
  • 3. Корректировка заданий для переноса в систему
    • 3.1 Формат ввода и вывода для заданий работы №1
    • 3.2 Структура и формат файлов для описания лабораторной работы №1
      • 3.2.1 Установка задач в систему дистанционного обучения
      • 3.2.2 Структура и формат файлов
      • 3.2.3 Установка файлов в систему
  • 4. Схема диалога пользователя с системой
    • 4.1 Выбор задания и отправка решения
    • 4.2 Просмотр результатов проверки
    • 4.3 Дополнительные возможности
  • Заключение
  • Приложения

Введение

лабораторный дистанционный обучение пользователь

Все более широкое внедрение компьютеров во все сферы жизни человека приводит к тому, что практически всюду, включая процесс обучения, их роль стремительно возрастает. Вообще-то использование компьютеров в процессе обучения началось уже довольно давно. Но разработанная и внедренная несколько лет назад в Гомельском государственном университете система дистанционного обучения Distance Learning Belarus, открыла кардинально новые возможности использования компьютеров в процессе работы студентов и учащихся. Уже сейчас при помощи этой системы проводятся многочисленные олимпиады по программированию, шахматные турниры, конкурсы по программированию микроконтроллеров и проектированию цифровых устройств. Но возможности, заложенные в систему дистанционного обучения, позволяют с успехом использовать ее ещё и для проведения лабораторных практикумов по различным учебным курсам. Преимущества такого использования очевидны. Во-первых, отпадает необходимость непосредственного участия преподавателя в процессе выдачи и проверки заданий. Во-вторых, возрастает объективность и скорость проверки заданий. Также студент получает возможность сдачи работ в удобное для него время. Так как система Distance Learning Belarus построена с использованием современных Internet технологий, то студент может получить и отправить на проверку выполненное задание практически с любой точки земного шара.

Была поставлена задача переработки лабораторного практикума «Разработка трансляторов для языков программирования» по курсу «Системное программное обеспечение» в целях дальнейшего переноса его в систему дистанционного обучения Distance Learning Belarus.

1. Назначение и структура лабораторного практикума

1.1 Назначение лабораторного практикума

Лабораторный практикум ставит собою цель закрепления теоретического материала учебного курса и выработки умения применять на практике полученные знания. Так же практикум служит для оценки уровня владения теоретическим материалом и умения применять его на практике.

1.2 Структура лабораторного практикума

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

1)Синтаксический анализ предложений для регулярных грамматик;

2)Нисходящий грамматический разбор;

3)Синтаксический анализ предложений для грамматик с предшествованием;

4)Синтаксический анализ предложений для LR(1) грамматик;

5)Промежуточные языки трансляции;

6)Генерация объектной программы;

7)Статическое распределение памяти для данных;

8)Динамическое распределение памяти для данных.

В каждой лабораторной работе по 10 различных вариантов заданий.

Некоторые лабораторные работы подразумевают написание программы на языке программирования.

2. Система дистанционного обучения

2.1 Базовые концепции разработки приложений для Интернет

Интернет - это множество разнообразных компьютерных систем, объединенных в сеть по протоколу TCP/IP. IP - протокол нижнего уровня, обеспечивающий передачу небольших пакетов данных. С помощью протокола TCP из пакетов, предлагаемых протоколом IP, создается поток и обеспечивается соединение. Далее процессы, выполняемые на различных компьютерах, могут начинать взаимодействие.

Имеется два типа таких процессов: клиент и сервер. Процесс-клиент инициирует сеанс работы с сервером, который всегда находится в состоянии ожидания. Процесс-сервер, получив запрос, выполняет соответствующие действия и возвращает результат клиенту. Данные механизмы реализуются на основе протокола прикладного уровня HTTP (передачи гипертекста), являющегося надстройкой TCP/IP.

В среде Интернет приложение-клиент, общающееся с web-сервером посредством протокола HTTP, называется браузером. HTML представляет собой язык, используемый при создании web-страниц, предоставляющий в распоряжение пользователя простой стандартный способ описания расположения текстовых и графических данных.

Одним из важнейших понятий в HTML является гиперссылка. Она позволяет разработчику страницы внедрять внедрять ссылки на другие документы или ресурсы прямо в страницу. Каждый ресурс имеет свой собственный уникальный адрес, называемый универсальным локатором ресурса (URL). Путь к ресурсу определяется относительно каталога web-мастера. По умолчанию загружается файл index.html или default.html. Параметры и указанные в них разделители определяются указанным методом доступа. В случае применения протокола HTTP символ “#” обозначает закладку внутри HTML-документа.

В настоящее время браузер превратился в мощное клиентское приложение за счет таких усовершенствований, как обеспечение независимости от операционной системы (достигнута с помощью языка программирования Java), возможность программирования клиентской части (получена благодаря языкам JavaScript и VB Script), предоставление полного доступа к клиентской операционной среде (реализуется посредством элементов ActiveX).

2.2 Основы языка HTML

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

Элементы HTML могут также иметь атрибуты. Атрибуты модифицируют характеристики элемента. В HTML-документы можно включать комментарии, помещая их между тегами комментариев HTML (<!-- и -->). Некоторые HTML-элементы поддерживают атрибут COLOR, задающий некоторый цвет.

Элемент «закладка» обеспечивает возможность создания гиперссылок. Они позволяют осуществлять переход на другую страницу в любом месте HTML документа.

2.3 Структура системы дистанционного обучения

С октября 1999 года на базе Гомельского Государственного университета функционирует система дистанционного обучения "Distance Learning Belarus". Система активно используется в учебном процессе. Дистанционное обучение является одной из перспективных областей развития информационных систем.

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

Structured Query Language (SQL) - язык, предназначенный для работы с базой данных. Он позволяет выбирать, обновлять и вставлять данные. О нем можно почитать в [3] и [7].

HyperText Markup Language (HTML) - язык разметки интернет страниц. JavaScript - язык для разработки программ-скриптов на машине клиента. Cascading Style Sheets (CSS) - каскадные таблицы стилей. Подробнее об этих языках можно узнать на сайтах http://gsu.unibel.by/prolib и http://www.w3c.com.

Active Server Pages (ASP) и Java, Internet Information Server Application Programming Interface (ISAPI) - технологии разработки программ исполняемых на интернет-сервере и генерирующих HTML-текст.

Протоколы SMTP, POP3, которые позволяют работать с почтовым сервером.

Взаимодействие пользователя с системой дистанционного может осуществляться при помощи почты или через интернет. В первом случае пользователь должен писать письма почтовому роботу (dl-service@gsu.unibel.by) используя определенный набор команд. Наиболее предпочтительный и удобный способ взаимодействия с системой - использование web-сайта (http://dl.gsu.unibel.by).

Система может работать с двумя типами пользователей: индивидуальный пользователь и команда. Команда при этом должна состоять из зарегистрированных пользователей.

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

Курс может не содержать теоретического материала - только задачи, такие курсы будем называть практическими.

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

Соревнования могут быть личные и командные.

По желанию составителей некоторые курсы могут быть доступны только индивидуальным ученикам или только командам.

В зависимости от типа курса могут строиться таблицы результатов различных видов:

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

для личных соревнований - таблица, с баллами по каждой задаче и общей суммой баллов.

таблица командных соревнований строится по правилам чемпионата ACM

Таблица таблиц (GRID) предназначена для отображения результатов пользователей отдельно из разных групп (например, пользователей сгруппированных по областям и классам).

Вложенные таблицы результатов. Сейчас они практически не используются, потому что появился новый тип таблиц - раскрывающиеся.

Раскрывающиеся таблицы.

Логически систему Distance Learning Belarus можно разбить на следующие основные модули: SQL-сервер и хранимые процедуры, web-сайт, почтовый робот и тестирующие программы

2.3.1 Web-сайт

Большая часть web-сайта написана с использованием технологии "Active Server Pages" (ASP) на языке Visual Basic. Некоторые отдельные части написаны на Java, JScript, с использованием CGI и ISAPI.

При этом используются интернет-сервера "Internet Information Services 5.0" (сокращенно IIS) и "Resin 2.1.0" (Java-страницы).

Web-сайт системы можно разбить на следующие функционально независимые разделы:

Внешняя часть. Это все что доступно пользователю без аутентификации.

Внутренняя часть для пользователя и команды. Этот раздел сайта становится доступным после регистрации и аутентификации.

Раздел администраторов. Здесь собраны web-средства мониторинга и управления группами пользователей. Он доступен для ограниченного числа лиц по адресу http://dl.gsu.unibel.by/admin

Раздел для проверяющих. Содержит средства получения файлов-решений, ввода оценки решения и комментариев проверки. Он доступен по адресу http://dl.gsu.unibel.by/checkers

Страничка редактора, которая используется для изменения параметров курса.

2.3.2 Файловая структура

Большинство файлов системы DLB находятся на сервере NewIT_SERVER.

К статическим данным относятся данные, которые изменяются и добавляются достаточно редко и изменяются только редакторами курсов.

Они находятся в следующих каталогах:

\\NewIT_SERVER\dldata\Archives - каталог содержит архивы задач (информацию по тестам и т.п., в зависимости от типа задачи). Информация по каждой задаче хранится в каталоге с именем ID.tsk, где ID - идентификатор задачи из базы данных. Каталог задачи необходим только в случае автоматического тестирования. В каталоге должен находится файл task.cfg, который содержит настройки задачи.

\\NewIT_SERVER\dldata\Tasks - каталог содержит HTML-файлы с условиями задач. Для английского условия имя файла должно иметь вид IDe.htm, для русского IDr.htm. Если для необходимого языка нет такого файла, то будет использован файл с именем ID.htm. Здесь, как и раннее, ID - идентификатор задачи.

\\NewIT_SERVER\dldata\Theory - каталог содержит HTML-файлы с теорией. Способ хранения аналогичный условиям задач.

\\NewIT_SERVER\dldata\Images - каталог содержит различные вложения (картинки, примеры, архивы, видео и аудио файлы) для условий задач и теории. Принятый формат: ID-N.* для задач и IDt-N.* для теории. Здесь ID - идентификатор задачи или блока теории, N - порядковый номер внутри задачи или блока теории. Допустимо также создавать каталоги с такими именами.

\\NewIT_SERVER\dldata\linksr.txt, \\NewIT_SERVER\dldata\linkse.txt, - список ссылок на аналогичные ресурсы (на русском и английских языках).

\\NewIT_SERVER\dldata\FAQe.txt, \\NewIT_SERVER\dldata\FAQr.txt - часто задаваемые вопросы (на русском и английских языках).

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

Такие данные находятся в следующих каталогах:

\\NewIT_SERVER\dldata\Queue - в этот каталог помещаются файлы с решениями задач, присланные для проверки. Формат имени файла:

uUUUUUUUUnNNNNNNNNcCCCCqQQQQQQQQ.*

Здесь

UUUUUUUU - идентификатор пользователя (8 символов),

NNNNNNNN - идентификатор узла задачи (8 символов),

CCCC - идентификатор курса (4 символа),

QQQQQQQQ - идентификатор решения в очереди (8 символов).

Все числа в шестнадцатеричной форме. Расширение файла - в зависимости от типа задачи. Пример:

u00018D2An00000659c0031q000043EE.PAS

Следует отметить, что в этом каталоге содержатся как проверенные так и не проверенные решения.

\\NewIT_SERVER\dldata\Tested - в данном каталоге хранятся архивы решений пользователей (всего более 30 000). \\NEWIT_SERVER\dlbroot - в данном каталоге размещается web-сайт

\\NewIT_SERVER\dl2 - в данном каталоге находятся часть web-сайта, написанная на Java

\\NIT_SERVER\NIT\Projects\DL - в данном каталоге хранятся исходные тексты всех версий компилируемых программных модулей сервера DLB

\\NIT_SERVER\d\DelTA - в данном каталоге работает основная проверяющая программа (Дельта)

\\nit1\c\people\daniel\DLMailBot - в данном каталоге работает почтовый робот

2.3.3 Основная проверяющая программа и проверяющие модули

Автоматическое тестирование всех задач происходит при помощи специальной программы - Дельта. Она написана на языке Delphi.

Каждые 15 секунд Дельта вызывает некоторую хранимую процедуру, которая возвращает запись из очереди на тестирование (если она есть). Далее задача помечается как взятая на тестирование. Дельта копирует во временный каталог решение участника и тесты. Если в файле task.cfg есть строки

TYPE = USERS

CHECKER = '«строка запуска проверяющего модуля»'

EXTTYPE = 'Пользовательская'

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

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

Если в файле task.cfg есть строка «COUNT_BY = TASK» (баллы начисляются только если решение проходит все тесты), то тестирование осуществляется до первого не пройденного теста.

Если решение имеет расширение zip или rar, то Дельта вызывает внешнюю программу для распаковки. В каталоге DelTA\ext находятся пакетные файлы zip.bat и rar.bat, которые запускаются для распаковки соответствующих архивов. Первым параметром им передается имя архива.

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

Стационарно Дельта работает только на одной машине - nit_server. Дельта установлена в каталог D:\DelTA

Для работы Дельта использует следующие каталоги:

DelTA\Arc - в данном каталоге хранятся внешние архиваторы

DelTA\CHECKERS - данный каталог содержит различные проверяющие модули (CTChecker - проверка задач по шахматам, MathCheck - проверка задач по математике, HLCCAD, IEESD-2000, WChecker)

DelTA\DelTASupervisor - в данном каталоге находится программа для автоматического возобновления тестирования в случае «зависания» Дельты.

DelTA\ext - каталог содержит bat-файлы для запуска внешних архиваторов.

DelTA\Lngs - в данном каталоге хранятся компиляторы и интерпретаторы (BC, Freepas, Perl, qbasic, TASM, TP)

Все запуски внешних программ фиксируются в протоколе DelTA\execution.log.

При проверке существуют следующие ограничения:

Ограничение на длину комментария поступающего от тестирующего модуля

ограничение работы чекера по времени (60 секунд)

В случае отсутсвия тестов участнику дает максимальный бал.

Медленное тестирование в случае если решение пытается читать с клавиатуры, а в task.cfg указано чтение с файла (60 секунд на каждый тест).

3. Корректировка заданий для переноса в систему

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

3.1 Формат ввода и вывода для заданий работы №1

Так как изначально проверка программы лабораторной работы №1 предусматривалась преподавателем, то никаких ограничений на ввод и вывод информации не производилось. Для переноса же лабораторной работы в систему дистанционного обучения необходимо определить конкретный формат входной и выходной информации.

Условие лабораторной работы подразумевает для заданной регулярной грамматики написать и отладить программу синтаксического анализа предложений порождаемого языка.

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

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

Программа должна вывести в файл output.txt в первую строку исходное предложение, которое было в файле input.txt.

Во вторую строку программа должна вывести число 0,1,2 или 3. Если исходное предложение корректное, то программа выводит число 0, а в третью строчку выводит результат разбора, формат которого однозначно задаётся для каждого варианта задания и четко прописывается в условии.

Если же входное предложение некорректное, то программа должна во вторую строчку вывести код ошибки 1,2 или 3, а в третью строчку выводить ничего не должна. Определим коды ошибок следующим образом:

Таблица 1

1

Если в процессе разбора встретился недопустимый символ

2

Если в процессе разбора встретился допустимый символ, но который не может находиться на этом месте

3

Если в процессе разбора обнаружилось, что предложение не закончено

3.2 Структура и формат файлов для описания лабораторной работы №1

3.2.1 Установка задач в систему дистанционного обучения

В настоящее время используется система загрузки задач и деревьев задач на сайт при помощи архива. Для этого необходимо иметь права редактора курса или быть одним из авторов задач на специальном курсе по закачке задач. Такая возможность имеется на странице редактора курса (ссылка "установка задач"), или на специальном курсе для установки задач под ссылкой "редактор".

Посылаемый архив должен содержать дерево разделов, тексты условий и каталоги с тестами.

Архив содержит дерево каталогов и задачи, вместе с директориями, содержащими тесты и при необходимости рисунки.

<русское_имя_узла(english_node_name)> - директория <русское_имя_узла(english_node_name)> - директория <русское_имя_узла(english_node_name)> - директория <индекс> - директория <индекс> - директория images - директория для рисунков(не обязательная) <любой файл> - рисунок <любой файл> - рисунок <любой файл> - рисунок taskrus.htm - русское условие задачи taskeng.htm - английское условие task.xml - файл описания задачи task.cfg - обязательный файл 1.in - 1-й входной файл тестов 1.out - 1-й выходной файл тестов <русское_имя_узла(english_node_name)> - директория

Также можно заменить файлы taskrus.htm и taskeng.htm на один файл task.htm с условием (будет вместо двух). Если русское имя задачи совпадает с английским, то можно просто заменить '<русское_имя_узла(english_node_name)>' на '<русское_имя_узла>#'. Если не предполагается использовать английского имени, то можно заменить '<русское_имя_узла(english_node_name)>' на '<русское_имя_узла>'. <индекс> - номер задачи, которая будет заменена или номер под которым задача будет установлена. Архив обрабатывается так, что дополнительные узлы(поддеревья) вставляются в лексикографическом(для строковых имен) или числовом (для числовых имен) порядке в текущее дерево. Аналогично, если создавать дерево в архиве, то внутри этого дерева названия узлов будут отсортированы: в лексикографическом порядке названия, а цифры в числовом порядке.

Дерево может и не существовать, тогда в архиве будет только:

<индекс> images <любой файл> task.htm task.xml task.cfg 1.in 2.out <индекс>

И задачи будут загружены списком в текущий раздел. По аналогии, в архиве может быть только дерево каталогов без задач.

Файл task.xml должен быть в windows-кодировке и содержать всего одну строку:

<task name="русское имя задачи" ename="english task name" author="Павел" cost="100" type="1"/>

Свойство author - необязательное. Все остальные необходимо указать.

Здесь type - тип задачи.

1 - задачи по программированию, HLCCAD, Winter, IEESD

4 - задачи по математике

10 - английский язык

Для того, чтобы загрузить картинки на сайт необходимо, чтобы в файлах условий(task.htm или taskrus.htm или taskeng.htm) были ссылки на них. Например <img src="images\image_name.jpg">. Это же эквивалентно тому, что если архив еще не запакован и запускается task.htm(taskrus.htm,taskeng.htm) из тех директорий, которые будут запакованы.

Для того, чтобы в условиях были ссылки на тесты, надо, чтобы в файлах условий(task.htm или taskrus.htm или taskeng.htm) были ссылки на них. Например <a href="test.in">. Это же эквивалентно тому, что архив еще не запакован и запускается task.htm(taskrus.htm,taskeng.htm) из тех директорий, которые будут запакованы. Таким же образом могут быть загружены картинки, но лучше пользоваться для них описанным выше способом.

Также существует возможность загрузки недоукомплектованных архивов. Этот режим используется, чтобы сэкономить время, необходимое для изменения уже установленных заданий. В директории задания могут отсутствовать файлы, которые изменять не надо. Единственный файл необходимый в задании - task.xml

Архивировать необходимо WINRAR-ом или WINZIP-ом. Главное, чтобы архиватор поддерживал длинные имена. На сайте все распаковывается WINRAR-ом.

3.2.2 Структура и формат файлов

В соответствии с вышеописанным форматом были подготовлены для каждого варианта работы следующие файлы:

task.htm - HTML файл с текстом задания;

task.xml - файл описания задачи;

task.pas - авторское решение задачи;

task.cfg - файл конфигурации задачи;

*.in - файлы ввода, содержащие тесты;

*.out - файлы правильных ответов.

Число файлов *.in и *.out одинаковое и зависит от сложности задания, для того, чтобы составить полное множество тестов.

Рассмотрим теперь более подробно содержимое этих файлов на примере 6 варианта задания:

Файл task.htm для этого варианта выглядит так:

<HTML> <HEAD><TITLE>Синтаксический анализ предложений для регулярной грамматики</TITLE></HEAD><BODY><CENTER> <H2>Вариант №6</H2> <TABLE> <TR><TD>Исходный файл:</TD><TD>Laba0106.pas или Laba0106.c</TD></TR> <TR><TD>Входной файл:</TD><TD>input.txt</TD></TR> <TR><TD>Выходной файл:</TD><TD>output.txt</TD></TR> </TABLE></CENTER> <H4>Постановка задачи</h4> <p> &nbsp;&nbsp;Для заданной регулярной грамматики написать и отладить программу синтаксического анализа предложений порождаемого языка. В ходе выполнения задания:

<OL> <LI>Разработать подпрограммы, обеспечивающие выделение лексических единиц из входного предложения;</LI> <LI>Построить в программе матрицы смен состояний и вызова подпрограмм;</LI> <LI>Обеспечить выдачу сообщений о различных видах синтаксических ошибок во входных предложениях</LI> </OL></P> <p> &nbsp;&nbsp;Обозначение терминальных символов при написании граммматики:<BR> &nbsp;&nbsp;&nbsp;&nbsp;ц - терминальный символ "цифра" (0,1,2,3,4,5,6,7,8,9);<BR> &nbsp;&nbsp;&nbsp;&nbsp;б - терминальный символ "буква" ('A'..'Z','a'..'z'); </P><P> <TABLE> <TR><TD

WIDTH=100>Z -&gt; P | A<BR>T -&gt; C | Tц<BR>B -&gt; T+ | T-<BR>P -&gt; Bц | Pц<BR>C -&gt; P.<BR>D -&gt; Cц<BR>A -&gt; Dц | Aц</TD><TD>Грамматика описывает предложения вида: &lt;число&gt;{+|-}&lt;число&gt;[.&lt;число&gt;], причем число после точки должно содержать не менее двух цифр.</TD></TR> </TABLE> &nbsp;&nbsp;В ходе разбора предложения должны быть получены значение всего выражения и число знаков после точки. </P> <H4>Ввод:</h4><P> &nbsp;&nbsp;Ввод исходных данных осуществляется из файла input.txt, который содержит одну строку, которая содержит предложение для разбора. </P> <H4>Вывод</h4><p> &nbsp;&nbsp;Для строки во входном файле программа должна вывести две или три строки решения согласно следуюшему правилу:<BR> <UL> <LI>Если предложение корректное, то программа должна вывести в первую строку исходное выражение, во вторую строку число 0, и в третью строку значение всего выражения M с двумя знаками после запятой и число знаков после точки N;</LI> <LI>Если предложение некорректное, то программа должна вывести в первую строку исходное выражение, а во вторую строку вывести номер ошибки (1,2 или 3):<BR> <TABLE> <TR><TD><B>1</B></TD><TD>Если в процессе разбора встретился недопустимый символ</TD></TR> <TR><TD><B>2</B></TD><TD>Если в процессе разбора встретился допустимый символ, но который не может находится на этом месте</TD></TR> <TR><TD><B>3</B></TD><TD>Если в процессе разбора обнаружилось, что предложение не закончено</TD></TR> </TABLE></LI> </UL></P> <h4>Пример 1</h4><p> Файл ввода input.txt содержит:<BR> <pre> 10-5.50 </PRE> Файл вывода output.txt для данного входного файла должен содержать следующие строки:<BR> <pre> 10-5.50 0 M=4.50 N=2 </PRE></P> <h4>Пример 2</h4><p>

Файл ввода input.txt содержит:<BR> <PRE> 10-a </pre>

Файл вывода output.txt для данного входного файла должен содержать следующие строки:<BR> <PRE> 10-a 1 </pre></P> </BODY> </HTML>

Файл task.xml для этого варианта выглядит так:

<task name="Синтаксический анализ предложений для регулярной грамматики" ename="" author="Мария Певнева" cost="1" type="1"/>

Файл task.pas содержит авторское решение данного варианта и выглядит так:

const ms:array[1..7,1..4]of byte=( { - + - . } {S} (2,0,0,0) {T} (2,3,3,0), {B} (4,0,0,0), {P} (4,0,0,5), {C} (6,0,0,0), {D} (7,0,0,0), {A} (7,0,0,0));

const ps:array[1..7,1..4]of byte=( { - + - . } {S} (1,0,0,0), {T} (1,2,3,0), {B} (4,0,0,0), {P} (4,0,0,0), {C} (5,0,0,0), {D} (5,0,0,0), {A} (5,0,0,0)); num:set of char=['0'..'9']; ee:boolean=true; var s:string; i,q,oq,n,ns:byte; m,x:real; sign:shortint;

begin assign(input,'input.txt'); assign(output,'output.txt'); reset(input); rewrite(output); readln(s); m:=0;x:=0;n:=0;i:=1;q:=1; writeln(s); while(i<=byte(s[0]))and(ee)do begin oq:=q; if s[i] in num then ns:=1 else if s[i]='+' then ns:=2 else if s[i]='-' then ns:=3 else if s[i]='.' then ns:=4 else ns:=0; case ps[q,ns] of 1:m:=m*10+byte(s[i])-48; 2:sign:=1; 3:sign:=-1; 4:x:=x*10+byte(s[i])-48; 5:begin x:=x*10+byte(s[i])-48;inc(n);end; end; q:=ms[q,ns]; if ns=0 then begin ee:=false; writeln(1); end else if q=0 then begin ee:=false; writeln(2); end; inc(i); end; if ee then if(q=4)or(q=7)then begin for i:=1 to n do x:=x/10; m:=m+sign*x; writeln('0'#13#10,'M=',m:2:2,' N=',n); end else writeln('3'); close(input); close(output);end.

Файл task.cfg содержит информацию о параметрах задачи и содержит следующие строки: COUNT_BY = TASK ; Баллы начисляются за задачу TIME_LIMIT = 15 ; Ограничение работы решения по времени 15 сек INPUT = FILE(input.txt) ; ввод данных из файла input.txt OUTPUT = FILE(output.txt) ; вывод данных в файл output.txt CHECKER = 'Специальная' ; необходимо использовать чекер CHECKSUBJECT = FILE ; указываются необходимые файлы для чекера CHECKFILES = {CHCHK.EXE} ; имя файла чекера TESTS_BEGIN 1 ; баллы за каждый тест 1; по одному 1 1 1 1 1 1 1TESTS_END

Файлы ввода с расширением in содержат входную информацию:

1.in

10-5.50

2.in

1+1

3.in

5+6.23

4.in

8-7

5.in

12+12.03

6.in

+45-56

7.in

78+56.6

8.in

6-8.89

9.in

4-6.321

10.in

1--1

11.in

1a

12.in

1-3h

Таблица 2

Файлы вывода с расширением out содержат правильные ответы:

1.out

10-5.50

0

M=4.50 N=2

2.out

1+1

0

M=2.00 N=0

3.out

5+6.23

0

M=11.23 N=2

4.out

8-7

0

M=1.00 N=0

5.out

12+12.03

0

M=24.03 N=2

6.out

+45-56

2

7.out

78+56.6

3

8.out

6-8.89

0

M=-2.89 N=2

9.out

4-6.321

0

M=-2.32 N=3

10.out

1--1

2

11.out

1a

1

12.out

1-3h

1

Таблица 3

С содержанием файлов остальных вариантов можно ознакомится в приложении.

3.2.3 Установка файлов в систему

Для установки подготовленного архива в систему дистанционного обучения нужно войти в систему дистанционного обучения с именем пользователя, обладающим правами редактирования курса. Затем нужно выбрать в верхней строке пункт «редактирование курсов». В окне браузера появиться следующая страница:

Рисунок 1. Редактирование курса

На этой странице имеется возможность задать или изменить настройки курса или перейти к добавлению, изменению или удалению задач.

При выборе пункта «Установка задач» осуществляется переход на другую страницу, с которой нужно перейти в режим добавления архива с задачами. Появиться следующая страница:

Рисунок 2. Загрузка архива с задачами

В поле «Архив:» нужно написать имя добавляемого архива и нажать кнопку «Отправить». Для указания имени архива можно нажать кнопку «Обзор…» и в открывшемся диалоге выбрать нужный архив. После этого задачи из архива добавляются в систему дистанционного обучения.

4. Схема диалога пользователя с системой

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

4.1 Выбор задания и отправка решения

После регистрации и входа в систему пользователь должен стать подписчиком курса «Метод разработки трансляторов». Выбрав этот курс, он может увидеть список вариантов заданий для первой лабораторной работы:

Рисунок 3.Список вариантов заданий

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

Рисунок 4. Условие задания

На этой же странице пользователь может указать путь к своему решению (исходному тексту программы решения на некотором языке программирования) в поле «Отправка решения:» или воспользоваться кнопкой «Обзор…». Нажатие кнопки «Отправить» осуществляет пересылку решения в систему, и оно становиться в очередь на проверку.

4.2 Просмотр результатов проверки

После отправки решения пользователь может перейти на страницу, содержащую протокол проверки, выбрав пункт «Протокол» в левой части окна:

Рисунок 5. Протокол проверки

лабораторный дистанционный обучение пользователь

Как видно на рисунке 5, пока протокол не содержит записей. Однако после проверки решения на этой странице можно узнать дату и время проверки результата, и собственно результат проверки отправленного решения. Для просмотра общих результатов пользователь должен перейти на страницу «Таблицы результатов», выбрав пункт «Результаты» в левой части окна:

Рисунок 6. Таблицы результатов

4.3 Дополнительные возможности

Как и в других курсах системы дистанционного обучения у подписчиков этого курса есть возможность обратиться за консультацией к разработчикам системы на странице «Консультации»:

Рисунок 7. Консультации

Также подписчики могут обсудить любую из предложенных задач в форуме, выбрав соответствующую ссылку (рисунок 4).

Заключение

Данная работа была выполнена на кафедре математических проблем управления. Была проведена работа по изучению принципа работы и структуры системы дистанционного обучения Distance Learning Belarus. Также было проведено знакомство с языком HTML и другими современными интернет технологиями.

После было проведено исследование об адаптации лабораторного практикума курса «Разработка трансляторов для языков программирования» для переноса его в систему дистанционного обучения. Затем была проведена переработка всех заданий первой лабораторной работы для их переноса в систему дистанционного обучения. Так же был осуществлен перенос подготовленных заданий в систему дистанционного обучения. В дальнейшем планируется полный перевод всего лабораторного практикума в систему Distance Learning Belarus.

Все это позволит повысить удобство доступа к курсу студентам, освободить преподавателей от рутинной работы по выдаче и проверке заданий и повысить скорость и объективность проверки лабораторных работ.

Приложение 1

Тексты авторских решений лабораторной работы №1.

Вариант №1:

const ms:array[1..6,1..5]of byte=(

{ Ц Б + - =}

{S} (0,2,0,0,0),

{Q} (2,2,0,0,3),

{R} (0,4,0,0,0),

{P} (4,4,5,5,0),

{T} (6,0,0,0,0),

{Z} (6,0,0,0,0));

const ps:array[1..6,1..5]of byte=(

{ Ц Б + - }

{S} (0,1,0,0,0),

{Q} (1,1,0,0,0),

{R} (0,2,0,0,0),

{P} (2,2,4,3,0),

{T} (5,0,0,0,0),

{Z} (5,0,0,0,0));

num:set of char=['0'..'9'];

sym:set of char=['A'..'Z','a'..'z'];

ee:boolean=true;

var s:string;

i,q,oq,ns:byte;

cons:longint;

p1,p2:string;

sign:shortint;

begin

assign(input,'input.txt');

assign(output,'output.txt');

reset(input);

rewrite(output);

readln(s);

p1:='';p2:='';cons:=0;

writeln(s);i:=1;q:=1;

while(i<=byte(s[0]))and ee do

begin

oq:=q;

if s[i] in num then ns:=1 else { }

if s[i] in sym then ns:=2 else { Определение }

if s[i]='+' then ns:=3 else { номера }

if s[i]='-' then ns:=4 else { }

if s[i]='=' then ns:=5 else ns:=0; { символа }

case ps[q,ns] of

1:p1:=p1+s[i];

2:p2:=p2+s[i];

3:sign:=-1;

4:sign:=+1;

5:cons:=cons*10+byte(s[i])-48;

end;

q:=ms[q,ns];

if ns=0 then

begin

ee:=false;

writeln(1);

end else

if q=0 then

begin

ee:=false;

writeln(2);

end;

inc(i);

end;

if ee then

if q=6 then writeln('0'#13#10'p1=',p1,' p2=',p2,' k=',sign*cons)

else writeln(3);

close(input);

close(output);

end.

Вариант №2:

const ms:array[1..4,1..4]of byte=(

{ Ц ( ) , }

{S} (0,2,0,0),

{Q} (3,0,0,0),

{P} (3,0,4,2),

{Z} (0,0,0,0));

const ps:array[1..4,1..4]of byte=(

{ Ц ( ) , }

{S} (0,1,0,0),

{Q} (2,0,0,0),

{P} (2,0,0,1),

{Z} (0,0,0,0));

num:set of char=['0'..'9'];

ee:boolean=true;

var s:string;

i,q,oq,ns:byte;

col:byte;

M:array[1..100]of word;

begin

assign(input,'input.txt');

assign(output,'output.txt');

reset(input);

rewrite(output);

readln(s);

col:=0;i:=1;q:=1;

fillchar(m,200,0);

writeln(s);i:=1;q:=1;

while(i<=byte(s[0]))and ee do

begin

oq:=q;

if s[i] in num then ns:=1 else { }

if s[i]='(' then ns:=2 else { Определение }

if s[i]=')' then ns:=3 else { номера }

if s[i]=',' then ns:=4 else ns:=0; { символа }

case ps[q,ns] of

1:inc(col);

2:m[col]:=m[Col]*10+byte(s[i])-48;

end;

q:=ms[q,ns];

if ns=0 then

begin

ee:=false;

writeln(1);

end else

if q=0 then

begin

ee:=false;

writeln(2);

end;

inc(i);

end;

if ee then

if q=4 then

begin

writeln(0);

for i:=1 to col do write('M(',i,')=',m[i],#32);

writeln;

end else writeln(3);

close(input);

close(output);

end.

Вариант №3:

const ms:array[1..4,1..4]of byte=(

{ Ц Б , ; }

{S} (0,2,0,0),

{Q} (2,2,3,4),

{P} (0,2,0,0),

{Z} (0,0,0,0));

const ps:array[1..4,1..4]of byte=(

{ Ц Б , ; }

{S} (0,2,0,0),

{Q} (2,2,1,0),

{P} (0,2,0,0),

{Z} (0,0,0,0));

num:set of char=['0'..'9'];

sym:set of char=['A'..'Z','a'..'z'];

ee:boolean=true;

var s:string;

i,q,oq,ns:byte;

col:byte;

S_:array[1..100]of string;

begin

assign(input,'input.txt');

assign(output,'output.txt');

reset(input);

rewrite(output);

readln(s);

col:=1;fillchar(s_,sizeof(s_),#0);

writeln(s);i:=1;q:=1;

while(i<=byte(s[0]))and ee do

begin

oq:=q;

if s[i] in num then ns:=1 else { }

if s[i] in sym then ns:=2 else { Определение }

if s[i]=',' then ns:=3 else { номера }

if s[i]=';' then ns:=4 else ns:=0; { символа }

case ps[q,ns] of

1:inc(col);

2:s_[col]:=s_[col]+s[i];

end;

q:=ms[q,ns];

if ns=0 then

begin

ee:=false;

writeln(1);

end else

if q=0 then

begin

ee:=false;

writeln(2);

end;

inc(i);

end;

if ee then

if q=4 then

begin

writeln(0);

for i:=1 to col do write('S(',i,')=',s_[i],#32);

writeln;

end else writeln(3);

close(input);

close(output);

end.

Вариант №4:

const ms:array[1..5,1..2]of byte=(

{ Ц . }

{S} (2,0),

{Q} (2,3),

{T} (4,0),

{P} (4,5),

{B} (5,0));

const ps:array[1..5,1..2]of byte=(

{ Ц . }

{S} (1,0),

{Q} (1,0),

{T} (2,0),

{P} (2,0),

{B} (3,0));

num:set of char=['0'..'9'];

ee:boolean=true;

var s:string;

i,q,oq,ns:byte;

hou,min,sec:word;

begin

assign(input,'input.txt');

assign(output,'output.txt');

reset(input);

rewrite(output);

readln(s);

hou:=0;min:=0;sec:=0;

writeln(s);i:=1;q:=1;

while(i<=byte(s[0]))and ee do

begin

oq:=q;

if s[i] in num then ns:=1 else { Определение }

if s[i]='.' then ns:=2 else ns:=0; { номера символа }

case ps[q,ns] of

1:hou:=hou*10+byte(s[i])-48;

2:min:=min*10+byte(s[i])-48;

3:sec:=sec*10+byte(s[i])-48;

end;

q:=ms[q,ns];

if ns=0 then

begin

ee:=false;

writeln(1);

end else

if q=0 then

begin

ee:=false;

writeln(2);

end;

inc(i);

end;

if ee then

if q in [2,4,5] then writeln('0'#13#10't=',hou*3600+min*60+sec)

else writeln('3');

close(input);

close(output);

end.

Вариант №5:

const ms:array[1..4,1..2]of byte=(

{ Ц - }

{S} (2,0),

{P} (3,0),

{Z} (3,4),

{Q} (2,0));

const ps:array[1..4,1..2]of byte=(

{ Ц - }

{S} (1,0),

{P} (1,0),

{Z} (1,2),

{Q} (1,0));

num:set of char=['0'..'9'];

sym:set of char=['A'..'Z','a'..'z'];

ee:boolean=true;

var s:string;

i,q,oq,ns:byte;

col:byte;

n:array[1..100]of byte;

m:array[1..100]of word;

begin

assign(input,'input.txt');

assign(output,'output.txt');

reset(input);

rewrite(output);

readln(s);

col:=1;fillchar(n,100,0);

fillchar(m,200,0);

writeln(s);i:=1;q:=1;

while(i<=byte(s[0]))and ee do

begin

oq:=q;

if s[i] in num then ns:=1 else {Определение }

if s[i]='-' then ns:=2 else ns:=0; {номера символа}

case ps[q,ns] of

1:begin inc(n[col]);inc(M[col],byte(s[i])-48);end;

2:inc(col);

end;

q:=ms[q,ns];

if ns=0 then

begin

ee:=false;

writeln(1);

end else

if q=0 then

begin

ee:=false;

writeln(2);

end;

inc(i);

end;

if ee then

if q=3 then

begin

writeln('0');

for i:=1 to col do write('n(',i,')=',n[i],#32);

for i:=1 to col do write('m(',i,')=',m[i],#32);

writeln;

end else writeln('3');

close(input);

close(output);

end.

Вариант №6:

const ms:array[1..7,1..4]of byte=(

{ Ц + - . }

{S} (2,0,0,0),

{T} (2,3,3,0),

{B} (4,0,0,0),

{P} (4,0,0,5),

{C} (6,0,0,0),

{D} (7,0,0,0),

{A} (7,0,0,0));

const ps:array[1..7,1..4]of byte=(

{ Ц + - . }

{S} (1,0,0,0),

{T} (1,2,3,0),

{B} (4,0,0,0),

{P} (4,0,0,0),

{C} (5,0,0,0),

{D} (5,0,0,0),

{A} (5,0,0,0));

num:set of char=['0'..'9'];

ee:boolean=true;

var s:string;

i,q,oq,n,ns:byte;

m,x:real;

sign:shortint;

begin

assign(input,'input.txt');

assign(output,'output.txt');

reset(input);

rewrite(output);

readln(s);

m:=0;x:=0;n:=0;i:=1;q:=1;

writeln(s);

while(i<=byte(s[0]))and(ee)do

begin

oq:=q;

if s[i] in num then ns:=1 else { Определение }

if s[i]='+' then ns:=2 else { номера }

if s[i]='-' then ns:=3 else { }

if s[i]='.' then ns:=4 else ns:=0; { символа }

case ps[q,ns] of

1:m:=m*10+byte(s[i])-48;

2:sign:=1;

3:sign:=-1;

4:x:=x*10+byte(s[i])-48;

5:begin x:=x*10+byte(s[i])-48;inc(n);end;

end;

q:=ms[q,ns];

if ns=0 then

begin

ee:=false;

writeln(1);

end else

if q=0 then

begin

ee:=false;

writeln(2);

end;

inc(i);

end;

if ee then

if(q=4)or(q=7)then

begin

for i:=1 to n do x:=x/10;

m:=m+sign*x;

writeln('0'#13#10,'M=',m:2:2,' N=',n);

end else writeln('3');

close(input);

close(output);

end.

Вариант №7:

const ms:array[1..3,1..3]of byte=(

{ Ц - +}

{S} (2,0,0),

{Z} (2,3,3),

{P} (2,0,0));

const ps:array[1..3,1..3]of byte=(

{ Ц - +}

{S} (1,0,0),

{Z} (1,3,2),

{P} (1,0,0));

num:set of char=['0'..'9'];

ee:boolean=true;

var s:string;

i,q,oq,ns:byte;

col:byte;

m:array[1..100]of longint;

v:longint;

sign:shortint;

begin

assign(input,'input.txt');

assign(output,'output.txt');

reset(input);

rewrite(output);

readln(s);

col:=1;v:=0;sign:=+1;

fillchar(m,400,0);

writeln(s);i:=1;q:=1;

while(i<=byte(s[0]))and ee do

begin

oq:=q;

if s[i] in num then ns:=1 else {Определение }

if s[i]='-' then ns:=2 else { номера }

if s[i]='+' then ns:=3 else ns:=0; { символа }

case ps[q,ns] of

1:M[col]:=M[Col]*10+byte(s[i])-48;

2:begin v:=v+sign*M[col];inc(col);sign:=+1;end;

3:begin v:=v+sign*M[col];inc(col);sign:=-1;end;

end;

q:=ms[q,ns];

if ns=0 then

begin

ee:=false;

writeln(1);

end else

if q=0 then

begin

ee:=false;

writeln(2);

end;

inc(i);

end;

if ee then

if q=2 then

begin

writeln('0');v:=v+sign*M[col];

for i:=1 to col do write('M(',i,')=',M[i],#32);

writeln('v=',v);

end else writeln('3');

close(input);

close(output);

end.

Вариант №8:

const ms:array[1..4,1..3]of byte=(

{ ' , c }

{S} (2,0,0),

{T} (3,2,2),

{Z} (2,4,0),

{P} (2,0,0));

const ps:array[1..4,1..3]of byte=(

{ ' , c }

{S} (2,0,0),

{T} (0,1,1),

{Z} (1,0,0),

{P} (2,0,0));

sym:set of char=[#32..#255];

ee:boolean=true;

var s:string;

i,q,oq,ns:byte;

col:byte;

ws:array[1..100]of string;

begin

assign(input,'input.txt');

assign(output,'output.txt');

reset(input);

rewrite(output);

sym:=sym-['''',','];

readln(s);

col:=0;fillchar(ws,sizeof(ws),0);

writeln(s);i:=1;q:=1;

while(i<=byte(s[0]))and ee do

begin

oq:=q;

if s[i]='''' then ns:=1 else {Определение }

if s[i]=',' then ns:=2 else { номера }

if s[i] in sym then ns:=3 else ns:=0; { символа }

case ps[q,ns] of

1:ws[col]:=ws[col]+s[i];

2:inc(col);

end;

q:=ms[q,ns];

if ns=0 then

begin

ee:=false;

writeln(1);

end else

if q=0 then

begin

ee:=false;

writeln(2);

end;

inc(i);

end;

if ee then

if q=3 then

begin

writeln('0');

for i:=1 to col do write('S(',i,')=',ws[i],#32);

writeln;

end else writeln('3');

close(input);

close(output);

end.

Вариант №9

const ms:array[1..5,1..4]of byte=(

{ Ц Б : \ }

{S} (0,2,0,0),

{B} (0,0,3,0),

{Q} (0,0,0,4),

{T} (0,5,0,0),

{Z} (5,5,0,4));

const ps:array[1..5,1..4]of byte=(

{ Ц Б : \ }

{S} (0,1,0,0),

{B} (0,0,0,0),

{Q} (0,0,0,0),

{T} (0,3,0,0),

{Z} (3,3,0,2));

num:set of char=['0'..'9'];

sym:set of char=['A'..'Z','a'..'z','~','_'];

ee:boolean=true;

var s:string;

i,q,oq,ns:byte;

Drive:char;

col:byte;

ws:array[1..100]of string;

begin

assign(input,'input.txt');

assign(output,'output.txt');

reset(input);

rewrite(output);

readln(s);

col:=1;fillchar(ws,sizeof(ws),0);

DRIVE:=#0;

writeln(s);i:=1;q:=1;

while(i<=byte(s[0]))and ee do

begin

oq:=q;

if s[i] in num then ns:=1 else {Определение }

if s[i] in sym then ns:=2 else { номера }

if s[i]=':' then ns:=3 else { символа }

if s[i]='\' then ns:=4 else ns:=0; { }

case ps[q,ns] of

1:Drive:=s[i];

2:inc(col);

3:ws[col]:=ws[col]+s[i];

end;

q:=ms[q,ns];

if ns=0 then

begin

ee:=false;

writeln(1);

end else

if q=0 then

begin

ee:=false;

writeln(2);

end;

inc(i);

end;

if ee then

if q=5 then

begin

writeln('0');

write('D=',drive);

for i:=1 to col do write(' S(',i,')=',ws[i]);

writeln;

end else writeln('3');

close(input);

close(output);

end.

Вариант №10

const ms:array[1..8,1..5]of byte=(

(* Ц . , { } *)

{S} (0,0,0,2,0),

{T} (3,0,0,0,0),

{Q} (3,4,0,0,0),

{C} (0,5,0,0,0),

{A} (6,0,0,0,0),

{D} (6,0,7,0,8),

{B} (3,0,0,0,0),

{Z} (0,0,0,0,0));

const ps:array[1..8,1..5]of byte=(

(* Ц . , { } *)

{S} (0,0,0,0,0),

{T} (1,0,0,0,0),

{Q} (1,0,0,0,0),

{C} (0,2,0,0,0),

{A} (1,0,0,0,0),

{D} (1,0,3,0,0),

{B} (1,0,0,0,0),

{Z} (0,0,0,0,0));

num:set of char=['0'..'9'];

ee:boolean=true;

var s:string;

i,q,oq,ns:byte;

col:byte;

m:array[1..100]of longint;

n:byte;

begin

assign(input,'input.txt');

assign(output,'output.txt');

reset(input);

rewrite(output);

readln(s);

col:=1;n:=1;

fillchar(m,sizeof(m),0);

writeln(s);i:=1;q:=1;

while(i<=byte(s[0]))and ee do

begin

oq:=q;

if s[i] in num then ns:=1 else {Определение }

if s[i]='.' then ns:=2 else { }

if s[i]=',' then ns:=3 else { номера }

if s[i]='{' then ns:=4 else { }

if s[i]='}' then ns:=5 else ns:=0; { символа }

case ps[q,ns] of

1:M[col]:=M[col]*10+byte(s[i])-48;

2:inc(col);

3:begin inc(col);inc(n);end;

end;

q:=ms[q,ns];

if ns=0 then

begin

ee:=false;

writeln(1);

end else

if q=0 then

begin

ee:=false;

writeln(2);

end;

inc(i);

end;

if ee then

if q=8 then

begin

writeln('0');

for i:=1 to col do write('M(',i,')=',M[i],#32);

writeln('n=',n);

end else writeln('3');

close(input);

close(output);

end.

Приложение 2

Исходные тексты условий заданий task.htm:

Вариант №1:

<HTML>

<HEAD><TITLE>Синтаксический анализ предложений для регулярной грамматики</TITLE></HEAD>

<BODY>

<CENTER>

<H2>Вариант №1</H2>

<TABLE>

<TR><TD>Исходный файл:</TD><TD>Laba0101.pas или Laba0101.c</TD></TR>

<TR><TD>Входной файл:</TD><TD>input.txt</TD></TR>

<TR><TD>Выходной файл:</TD><TD>output.txt</TD></TR>

</TABLE>

</CENTER>

<H4>Постановка задачи</h4>

<p>

&nbsp;&nbsp;Для заданной регулярной грамматики написать и отладить программу синтаксического анализа предложений порождаемого языка. В ходе выполнения задания:

<OL>

<LI>Разработать подпрограммы, обеспечивающие выделение лексических единиц из входного предложения;</LI>

<LI>Построить в программе матрицы смен состояний и вызова подпрограмм;</LI>

<LI>Обеспечить выдачу сообщений о различных видах синтаксических ошибок во входных предложениях</LI>

</OL></P>

<p>

&nbsp;&nbsp;Обозначение терминальных символов при написании граммматики:<BR>

&nbsp;&nbsp;&nbsp;&nbsp;ц - терминальный символ "цифра" (0,1,2,3,4,5,6,7,8,9);<BR>

&nbsp;&nbsp;&nbsp;&nbsp;б - терминальный символ "буква" ('A'..'Z','a'..'z');

</P>

<P>

<TABLE>

<TR><TD WIDTH=150>Z&nbsp;-&gt;&nbsp;Tц&nbsp;|&nbsp;Zц<BR>T&nbsp;-&gt;&nbsp;P+&nbsp;|&nbsp;P-<BR>P&nbsp;-&gt;&nbsp;Rб&nbsp;|&nbsp;Pб&nbsp;|&nbsp;Pц<BR>R&nbsp;-&gt;&nbsp;Q=<BR>Q&nbsp;-&gt;&nbsp;б&nbsp;|&nbsp;Qб&nbsp;|&nbsp;Qц</TD><TD>Грамматика описывает предложения вида: &lt;идентификатор&gt;=&lt;идентификатор&gt;{+|-}&lt;целое&gt;.</TD></TR>

</TABLE>

&nbsp;&nbsp;В ходе разбора предложения должны быть получены две переменные с идентификаторами и значение константы (возможно отрицательное).

</P>

<H4>Ввод:</h4>

<P>

&nbsp;&nbsp;Ввод исходных данных осуществляется из файла input.txt, который содержит строку, содержащую предложение для разбора.

</P>

<H4>Вывод</h4>

<p>

&nbsp;&nbsp;Для строки во входном файле программа должна вывести две или три строки решения согласно следуюшему правилу:<BR>

<UL>

<LI>Если предложение корректное, то программа должна вывести в первую строку исходное выражение, во вторую строку число 0, и в третью строку две переменные с идентификаторами p1 и p2, и значение константы k, разделенные одним пробелом;</LI>

<LI>Если предложение некорректное, то программа должна вывести в первую строку исходное выражение, а во вторую строку вывести номер ошибки (1,2 или 3):<BR>

<TABLE>

<TR><TD><B>1</B></TD><TD>Если в процессе разбора встретился недопустимый символ</TD></TR>

<TR><TD><B>2</B></TD><TD>Если в процессе разбора встретился допустимый символ, но который не может находится на этом месте</TD></TR>

<TR><TD><B>3</B></TD><TD>Если в процессе разбора обнаружилось, что предложение не закончено</TD></TR>

</TABLE></LI>

</UL></P>

<h4>Пример 1</h4>

<p>

Файл ввода input.txt содержит:<BR>

<pre>

a11=b-5

</PRE>

Файл вывода output.txt должен содержать следующие строки:<BR>

<pre>

a11=b-5

0

p1=a11 p2=b k=-5

</PRE>

</P>

<h4>Пример 2</h4>

<p>

Файл ввода input.txt содержит:<BR>

<PRE>

1a=qwe-90

</pre>

Файл вывода output.txt должен содержать следующие строки:<BR>

<PRE>

1a=qwe-90

2

</pre></P>

</BODY>

</HTML>

Вариант №2:

<HTML>

<HEAD><TITLE>Синтаксический анализ предложений для регулярной грамматики</TITLE></HEAD>


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.