Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_tlpt_12_7.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
494.08 Кб
Скачать

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. Синтаксический анализатор.

Схема разбора инструкций ветвления и цикла.

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

  1. ветвление:

if(условное выражение) then

...последовательность операторов...

[elseif(условное выражение) then

...последовательность операторов...]

[else

...последовательность операторов...]

endif

  1. цикл:

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 )

разобратьЦикл();

}

Замечания по коду:

  1. Проверку соответствия типов при разборе выражений необходимо реализовать самостоятельно;

  2. Разбор других видов цикла (for, do…while) реализуется аналогично.

Примеры кода:

Файлы SyntaxAnalyzer.cs в проекте.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]