- •Лабораторные работы
- •1. Порядок выполнения работы.
- •2. Содержание отчета.
- •Лабораторная работа № 1.1. Создание каркаса транслятора.
- •Лабораторная работа № 1.2. Разбор исходного файла.
- •1. Порядок выполнения работы.
- •2. Содержание отчета.
- •Лабораторная работа №3.1. Синтаксический анализатор.
- •1. Порядок выполнения работы.
- •2. Содержание отчета.
- •Лабораторная работа №5. Разработка генератора кода
- •1. Порядок выполнения работы.
- •2. Теоретическая часть
- •3. Содержание отчета
- •Лабораторным работам
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •Вариант 13
- •Вариант 14
- •Вариант 15
- •Вариант 16
- •Курсовой проект
- •Оформление
- •Пустые строки
- •Пробелы в строке
- •Локальные переменные
- •Комментарии
- •Инструкции (statements)
- •Оформление if, if-else, if-else if-else
- •Оформление for, foreach
- •Оформление while, do-while
- •Оформление switch
- •Оформление try-catch
- •Указания по оформлению псевдокода
1. Порядок выполнения работы.
1.1. Ознакомиться разделами 7-11, 14, 15 пособия [1].
1.2. По варианту задания построить синтаксический граф для реализуемого языка. При этом преобразовать описание языка таким образом, чтобы оно учитывало приоритет операций в выражениях.
1.3. Составить контрольные примеры на реализуемом языке. Хотя бы один пример должен проверять поведение вашей программы при наличии синтаксических ошибок в контрольном примере.
1.4. Запрограммировать и отладить программу, производящую синтаксический анализ реализуемого языка. Выполнить тестирование на контрольных примерах. При этом пример пропускается через программу лексического анализа, а файл с лексемами является входным для программы синтаксического анализа. При необходимости доработать модуль сканирования. Лабораторная работа считается выполненной, если программа выдает правильные и понятные сообщения о синтаксических ошибках с указанием строк, где эта ошибка имеет место.
1.5. Оформить отчет.
2. Содержание отчета.
2.1. Название работы и ее исполнители.
2.2. Цель работы.
2.3. Синтаксические диаграммы реализуемого языка.
2.4. Краткое (по 2-3 предложения) описание процедур (функций), из которых состоит программа синтаксического анализа. Наилучший вариант – включение описаний в текст программы в виде комментариев.
2.5. Листинг программы.
2.6. В случае необходимости – информация о доработке программы лексического анализа.
2.7. Распечатки контрольных примеров и результатов их выполнения.
2.8. Выводы по проделанной работе.
Лабораторная работа №3.1. Синтаксический анализатор.
Общая схема разбора. Реализация разбора секции объявления переменных исходного языка с сохранением идентификаторов в таблице имен.
По соглашению, синтаксис нашего исходного языка имеет вид:
ТипДанных идентификатор1[, идентификатор2[, … [, идентификаторN]]]
begin
[последовательность команд]
end
Так как мы реализуем однопроходный транслятор, синтаксический и лексический анализ должны выполняться параллельно, поэтому методы лексического анализатора будут вызываться преимущественно из методов синтаксического анализатора.
В первую очередь в синтаксическом анализаторе (класс SyntaxAnalyzer) необходимо определить вспомогательный метод, который будет проверять текущую лексему на соответствие лексеме ожидаемой.
проверитьЛексему( Lexems ожидаемаяЛексема )
{
если( LexicalAnalyzer.текущаяЛексема != ожидаемаяЛексема )
ошибка();
иначе
LexicalAnalyzer.разобратьСледующуюЛексему();
}
Далее определим метод разбора секции объявления переменных:
разобратьОбъявлениеПеременных()
{
проверитьЛексему( Lexems.ТипДанных );
если( LexicalAnalyzer.текущаяЛексема != Lexems.Идентификатор )
ошибка();
иначе
{
NameTable.добавитьИдентификатор( LexicalAnalyzer.текущееИмя, , tCat.Var );
LexicalAnalyzer.разобратьСледующуюЛексему();
}
пока( LexicalAnalyzer.текущаяЛексема == Lexems.Запятая )
{
если( LexicalAnalyzer.текущаяЛексема != Lexems.Идентификатор )
ошибка();
иначе
{
NameTable.добавитьИдентификатор( LexicalAnalyzer.текущееИмя, , tCat.Var );
LexicalAnalyzer.разобратьСледующуюЛексему();
}
}
}
Основным методом анализатора будет метод запуска синтаксического разбора. В нем мы и будем вызывать описанный выше метод.
компилировать()
{
LexicalAnalyzer.инициализировать();
разобратьОбъявлениеПеременных();
проверитьЛексему( Lexems.ПереносСтроки );
}
Тестирование описанного функционала можно провести, вызывая метод SyntaxAnalyzer.компилировать() для разных (в том числе некорректных) вариантов объявления переменных.
Замечания по коду:
Реализация метода ошибка() не должна допускать остановки синтаксического разбора. По окончанию разбора пользователю должны быть выведены все ошибки, возникшие в ходе синтаксического анализа.
В сообщениях о синтаксических ошибках необходимо указывать информацию о месте их возникновения. Получить эти сведения можно с помощью методов-свойств класса Reader: Reader.номерСтроки, Reader.позицияСимволаВСтроке, Reader.текущийСимвол.
Примеры кода:
Файл SyntaxAnalyzer.cs в проекте.
ЛАБОРАТОРНАЯ РАБОТА №4.
ФОРМИРОВАНИЕ ПОСТФИКСНОЙ ЗАПИСИ