Министерство образования Республики Беларусь Учреждение образования “Белорусский государственный университет информатики и радиоэлектроники” Кафедра интеллектуальных информационных технологий Факультет информационных технологий и управления МЕТОДИЧЕСКИЕ УКАЗАНИЯ к лабораторному практикуму ПО КУРСУ: « Языковые процессоры интеллектуальных систем и интеллектуализация CASE-технологий » МИНСК Целью изучения дисциплины «Языковые процессоры интеллектуальных систем» является рассмотрение теории построения языковых процессоров, методов анализа и проектирования языков программирования различного назначения, в том числе используемых в интеллектуальных системах. В результате изучения дисциплины студенты должны знать: основные концепции языков программирования; теорию построения компиляторов; методы и способы формального определения синтаксиса и семантики языков различного назначения; уметь: разрабатывать основные блоки языковых процессоров; разрабатывать формальные спецификации языков различного назначения. 1. СТРУКТУРА ЛАБОРАТОРНОГО ПРАКТИКУМА 1. 2. № 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Лабораторный практикум состоит из двух частей: Реализовать компилятор для языка программирования. Разработать формальную спецификацию языка программирования с заданными характеристиками. Тематический план лабораторного практикума следующий: Тема Уточнение задания. Разработка языка Уточнение задания. Разработка языка Разработка лексического анализатора Решение задач. Конечные автоматы. Регулярные выражения. Разработка синтаксического анализатора. Формирование грамматики языка Решение задач. Построение таблицы предиктивного анализатора Разработка синтаксического анализатора. Синтаксически управляемая трансляция Решение задач. Построение таблицы SLR-анализатора Генерация промежуточного кода. Решение задач. Синтаксически управляемая трансляция Выполнение промежуточного кода Защита первой части практикума (Разработка компилятора) Разработка языка программирования. Решение задач. Разработка языка программирования. Состав подгруппа группа подгруппа группа подгруппа группа подгруппа группа подгруппа группа подгруппа группа подгруппа группа подгруппа 16. Защита лабораторного практикума. группа 2. ОПИСАНИЕ ПЕРВОЙ ЧАСТИ ЛАБОРАТОРНОГО ПРАКТИКУМА 2.1. Варианты заданий Варианты языков программирования для разработки компилятора: 1) язык, описывающий математические вычисления; 2) язык, описывающий работу с графом; 3) язык, описывающий работу с множествами; 4) язык, описывающий работу со строками; 5) язык, описывающий работу со списками; 6) можно предлагать свой вариант разрабатываемого языка. Варианты форматов генерации целевого кода для компилятора: 1) свой формат и соответственно требуется разработать виртуальную машину, которая будет выполнять программу, записанную в этом формате; a. трехадресный код b. синтаксическое дерево 2) целевой код на языке C\C++ или Java с автоматизированной компиляцией его в выполняемый модуль; 3) целевой код на языке Assembler и автоматизированная компиляция его в выполняемый модуль; 4) целевой код в формате понимаемый компилятором GNU GCC (см. Дополнительная литература\GCC-Frontend, RTL и Frontend) 5) целевой код для JVM (Java Virtual Machine) 6) целевой код для LLVM (http://llvm.org) 2.2. Требования к разрабатываемому языку Обязательное наличие: 1. Не менее двух типов данных. 2. Выражения со скобками. 3. Оператора присваивания, операторов цикла (“while”, “until”, “for”) и оператора ветвления (“if”). 4. Встроенных функций ввода/вывода (“read”/“write”). 5. Глобальные и локальные переменные. 6. Пользовательских подпрограмм с параметрами. 2.3. Порядок выполнения и промежуточная отчетность № Тема занятия Что должно быть: 1. Что делаем на занятии: 2. 3. 4. 5. Выбираем вариант разрабатываемого языка Пишем пример какого-нибудь алгоритма на придуманном языке. Что делаем дома: Разрабатываем минимум 3 (три) примера логически цельных алгоритма на придуманном языке Начинаем описывать синтаксис языка, используя формат ANTLR Что должно быть: Три (3) текстовых файла с примерами на придуманном языке Первая версия синтаксиса языка, описанная в формате ANTLR Что делаем на занятии: Дополняем синтаксис языка. Генерируем код синтаксического анализатора и добавляем “main” Что делаем дома: Дописываем синтаксический анализатор и тестируем его на имеющихся примерах. Что должно быть: Примеры, файл грамматики, программный код синтаксического анализатора. Что делаем на занятии: Определяем набор семантических правил для языка. Добавляем в грамматику действия по выполнению семантических правил. Выбираем вариант целевого кода Что делаем дома: Дописываем семантический анализатор и проверяем на примерах выдачу синтаксических и семантических ошибок. Изучаем формат выбранного целевого кода. Что должно быть: Примеры, файл грамматики, программный код синтаксического и семантического анализатора Что делаем на занятии: Добавляем в грамматику действия по формированию целевого кода. Что делаем дома: Доделываем программный код компилятора и проверяем его на примерах. Что должно быть: Версия компилятора с некоторыми небольшими недоделками Что делаем на занятии: Устраняем недоделки в компиляторе. Тестируем компилятор. Формируем отчет по лабораторной работе. Что делаем дома: Формируем отчет по лабораторной работе. Подготавливаемся к защите лабораторной работы. 6. Что должно быть: Программный код компилятора. Собранный компилятор. Примеры. Отчет. Что делаем на занятии: Защищаем лабораторную работу. Выбираем вариант задания по второй лабораторной работе Что делаем дома: Готовимся ко второй лабораторной работе. 2.4. Форма итоговой отчётности Защита лабораторного практикума состоит из следующих частей: 1. Демонстрация практических результатов и проверка корректность работы и соответствие документации. 2. Проверка документации и результатов аналитического задания. 3. Ответ на контрольные вопросы. Содержание отчета по первой части лабораторного следующее: 1. Спецификация разработанного языка программирования. 2. Результат аналитического задания. 3. Описание архитектуры разработанного компилятора. 4. Примеры работы компилятора. практикума Требования к оформлению отчета аналогичны требованиям оформления научно-технической документации. Допускается оформления фрагментов исходных текстов и примеров шрифтом меньшего размера. 3. ОПИСАНИЕ ВТОРОЙ ЧАСТИ ЛАБОРАТОРНОГО ПРАКТИКУМА 3.1. Варианты заданий Классификационные признаки, которыми разрабатываемый язык: 1. Объявление переменных: a) явное; b) неявное. 2. Связывание типа с переменной: a) статическое; b) динамическое. 3. Связывание ячейки памяти с переменной: a) статические; b) автоматические; c) явно динамические; d) неявно динамические. должен обладать 4. Константы: a) присутствуют; b) отсутствуют. 5. Проверка типов: a) строгая типизация; b) нестрогая типизация. 6. Область видимости: a) статическая; b) динамическая. 7. Структуры, ограничивающие область видимости: a) подпрограммы; b) блочные операторы. 8. Элементарные типы данных: a) целые числа; b) числа с плавающей точкой; c) булевский тип; d) символьный тип. 9. Типы данных, определяемые пользователем: a) символьные строки; b) перечислимые типы; c) ограниченные типы; d) массивы; e) ассоциативные массивы; f) записи; g) объединения; h) множества; i) указатели; j) ссылки. 10. Определение пользователем абстрактных типов данных: a) присутствуют; b) отсутствуют. 11. Перегрузка операторов: a) присутствуют; b) отсутствуют. 12. Преобразование типов: a) явное; b) неявное. 13. Операторы сокращенного вычисления: a) присутствуют; b) отсутствуют. 14. Оператор присваивания: a) одноцелевой; b) многоцелевой; c) составной; d) унарный. 15. Операторы ветвления: a) двухвариантные; b) многовариантные. 16. Операторы цикла: a) итерационные b) логически управляемые c) основанные на структурах данных 17. Передача параметров в подпрограмму: a) по значению; b) по результату; c) по значению и результату; d) по ссылке; e) по имени. 18. Перегрузка подпрограмм: a) присутствуют; b) отсутствуют. 19. Настраиваемые подпрограммы: a) присутствуют; b) отсутствуют. 20. Сопрограммы: a) присутствуют; b) отсутствуют. 21. Обработка исключительных ситуаций: a) присутствуют; b) отсутствуют. Если какой-то классификационный признак не указан, то он должен выбираться самостоятельно. Вариант Перечень классификационных признаков 1. 1a2b3a4a7a7b19a 2. 1b2a3b5a7b20a 3. 1a2b3d6a8a8c21a 4. 1b2a3c5b7a19a 5. 1a2b3b4a8b8d20a 6. 1b2a3a6b7a7b21a 7. 1a2b3d5a7b19a 8. 1b2a3a6a8a8b20a 9. 1a2b3b5b7a21a 10. 1b2a3c4a8c8d19a 11. 1a2b3d6b7a7b20a 12. 1b2a3a5a7b21a 13. 1a2b3b6a8a8b19a 14. 1b2a3c5b7a20a 15. 1a2b3d4a8b8c21a 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 1b2a3a6b7a7b19a 1a2b3b5a8d8a20a 1b2a3c6a7b21a 1a2b3d5b8b8a19a 1b2a3a4a7a20a 1a2b3b6b8c8d21a 1b2a3c5a7a7b19a 1a2b3d6a8a8d20a 1b2a3a5b7a21a 1a2b3b4a19a 1b2a3c6b7b20a 1a2b3d5a8b21a 1b2a3a6a7a7b19a 1a2b3b5b20a 1b2a3c4a6b21a 3.2. Требования к результату Обязательно выбрать недостающие классификационные признаки. Разрабатываемая спецификация языка должна включать: 1. Описание алфавита. 2. Описание токенов. 3. Описание атрибутивной грамматики для разрабатываемого языка. Семантические действия должны отражать операционную семантику языка. 4. Несколько примеров на разработанном языке. Для каждого приведенного примера записать его операционную семантику. 3.3. Форма отчетности 1. Отчет, содержащий спецификацию языка (см. 3.2). 2. (дополнительно) Файлы, подготовленные программой antlrworks, описывающие грамматику языка и правила построения абстрактного дерева.