- •Лабораторные работы
- •1. Порядок выполнения работы.
- •2. Содержание отчета.
- •Лабораторная работа № 1. Лабораторная работа № 1.1. Создание каркаса транслятора.
- •Лабораторная работа № 2 Лабораторная работа № 1.2. Разбор исходного файла.
- •Лабораторная работа № 3.
- •1. Порядок выполнения работы.
- •2. Содержание отчета.
- •Лабораторная работа № 5. Лабораторная работа №3.1. Синтаксический анализатор.
- •Лабораторная работа № 6. Лабораторная работа №3.2. Синтаксический анализатор.
- •Лабораторная работа № 7. Лабораторная работа №3.3. Синтаксический анализатор.
- •1. Порядок выполнения работы.
- •2. Содержание отчета.
- •Лабораторная работа №5. Разработка генератора кода
- •1. Порядок выполнения работы.
- •2. Теоретическая часть
- •Практическая часть.
- •Лабораторная работа № 9. Генератор кода 5.2.
- •4. Содержание отчета
- •5. Содержание отчета
- •Лабораторная работа № 11. Синтаксический анализатор.
- •Лабораторная работа №12. Генератор кода 5.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
- •Указания по оформлению псевдокода
4. Содержание отчета
3.1. Название работы и ее исполнители.
3.2. Цель работы.
3.3. Краткое (по 2-3 предложения) описание процедур (функций) программы генерации кода.
3.4. Листинг программы.
3.5. В случае необходимости, информация о доработке программ лексического и синтаксического анализа.
3.6. Распечатки контрольных примеров и результатов их выполнения.
3.7. Выводы по проделанной работе.
Лабораторная работа № 10. Тестирование приложения.
ТЕСТИРОВАНИЕ ПРОЕКТА
Тестирование проходит по ошибкам, целенаправленно внесенным во входной файл. Ниже приведены возможные варианты ошибок в различных блоках транслятора.
1. ЛЕКСИЧЕСКОГО АНАЛИЗАТОРА
- определение некорректных лексем;
- неверное определение класса лексем;
2. СИНТАКСИЧЕСКОГО АНАЛИЗАТОРА
- неверный порядок расположение лексем в строке, операторе;
- использование не определенной переменной;
- использование в операторе присваивания последовательно расположенных:
- знаков операций;
- идентификаторов;;
3. ПОСТФИКСНОЙ ЗАПИСИ
- использование всех операций в операторе присваивания;
- использование скобок в операторе присваивания;
4. ГЕНЕРАТОРА КОДА
5. Содержание отчета
5.1. Название работы и ее исполнители.
5.2. Цель работы.
5.3. Краткое (по 2-3 предложения) описание процедур тестирование проекта .
5.4. Примеры тестов – входных и выходных файлов..
5.5. Скриншоты результатов тестирования.
5.6. Выводы по проделанной работе.
ЛАБОРАТОРНАЯ РАБОТА №6.
РАЗРАБОТКА СИНТАКСИЧЕСКОГО АНАЛИЗАТОРА 2
Лабораторная работа № 11. Синтаксический анализатор.
Схема разбора инструкций ветвления и цикла.
По соглашению в нашем языке допустимы инструкции ветвления и цикла со следующим синтаксисом:
ветвление:
if(условное выражение) then
...последовательность операторов...
[elseif(условное выражение) then
...последовательность операторов...]
[else
...последовательность операторов...]
endif
цикл:
while(условное выражение)
...последовательность операторов...
endwhile
В первую очередь, дополним метод разобратьВыражение() синтаксического анализатора разбором логических выражений.
tType разобратьВыражение()
{
tType t = разобратьСложениеИлиВычитание();
если( LexicalAnalyzer.текущаяЛексема == Lexems.Равно
|| LexicalAnalyzer.текущаяЛексема == Lexems.НеРавно
|| LexicalAnalyzer.текущаяЛексема == Lexems.Меньше
|| LexicalAnalyzer.текущаяЛексема == Lexems.Больше
|| LexicalAnalyzer.текущаяЛексема == Lexems.МеньшеИлиРавно
|| LexicalAnalyzer.текущаяЛексема == Lexems.БольшеИлиРавно )
{
switch( LexicalAnalyzer.текущаяЛексема )
{
}
LexicalAnalyzer.разобратьСледующуюЛексему();
разобратьСложениеИлиВычитание();
t = tType.Bool;
}
вернуть t;
}
Далее реализуем методы разобратьВетвление() и разобратьЦикл().
разобратьВетвление()
{
проверитьЛексему( Lexems.If );
разобратьВыражение();
проверитьЛексему( Lexems.Then );
разобратьПоследовательностьИнструкций();
пока( LexicalAnalyzer.текущаяЛексема == Lexems.ElseIf )
{
LexicalAnalyzer.разобратьСледующуюЛексему();
разобратьВыражение();
проверитьЛексему( Lexems.Then );
разобратьПоследовательностьИнструкций();
}
если( LexicalAnalyzer.текущаяЛексема == Lexems.Else )
{
LexicalAnalyzer.разобратьСледующуюЛексему();
разобратьПоследовательностьИнструкций();
}
проверитьЛексему( Lexems.EndIf );
}
разобратьЦикл()
{
проверитьЛексему( Lexems.While );
разобратьВыражение();
разобратьПоследовательностьИнструкций();
проверитьЛексему( Lexems.While );
}
И, наконец, дополним метод разобратьИнструкцию() вызовом соответствующих методов в нужных случаях.
разобратьИнструкцию()
{
если( LexicalAnalyzer.текущаяЛексема == Lexems. Идентификатор )
{
Идентификатор Х = NameTable.найтиПоИмени( LexicalAnalyzer.текущееИмя );
если( !Х. эквивалентно( новый Идентификатор() ) )
разобратьИнструкциюПрисваивания();
иначе
ошибка();
}
иначе если( LexicalAnalyzer.текущаяЛексема == Lexems.ВыводНаПечать )
разобратьИнструкциюВыводаНаПечать();
иначе если( LexicalAnalyzer.текущаяЛексема == Lexems.If )
разобратьВетвление();
иначе если( LexicalAnalyzer.текущаяЛексема == Lexems.While )
разобратьЦикл();
}
Замечания по коду:
Проверку соответствия типов при разборе выражений необходимо реализовать самостоятельно;
Разбор других видов цикла (for, do…while) реализуется аналогично.
Примеры кода:
Файлы SyntaxAnalyzer.cs в проекте.
