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

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.компилировать() для разных (в том числе некорректных) вариантов объявления переменных.

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

  1. Реализация метода ошибка() не должна допускать остановки синтаксического разбора. По окончанию разбора пользователю должны быть выведены все ошибки, возникшие в ходе синтаксического анализа.

  2. В сообщениях о синтаксических ошибках необходимо указывать информацию о месте их возникновения. Получить эти сведения можно с помощью методов-свойств класса Reader: Reader.номерСтроки, Reader.позицияСимволаВСтроке, Reader.текущийСимвол.

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

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

ЛАБОРАТОРНАЯ РАБОТА №4.

ФОРМИРОВАНИЕ ПОСТФИКСНОЙ ЗАПИСИ

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