
- •21. Нисходящий и восходящий грамматический разбор.
- •22. Общая схема работы компилятора.
- •23. Компилятор, транслятор, интерпретатор, блаблабла.
- •24. Фазы компиляции.
- •25. Фаза лексического анализа.
- •26. Таблицы Идентификаторов.
- •27. Способы организации таблиц идентификаторов.
- •29. Методы сортировки.
- •30. Фаза синтаксического анализа.
- •31. Обработка синтаксических ошибок. Виды ошибок.
- •32. Стратегии восстановления после ошибок.
- •33. Способы внутреннего представления входной программы.
- •34. Фаза семантического анализа.
- •35. Фаза генерации кода.
- •36. Виды переменных.??? Классификация областей памяти.
- •37. Фаза генерации кода. Основные принципы.
- •38. Фаза оптимизации кода.
34. Фаза семантического анализа.
Входными данными для семантического анализатора являются:
1)ТИ
2)Результаты разбора синтаксических конструкций входного языка.
Результаты выполнения синтаксического анализатора могут быть представлены в какой-либо форме внутреннего представления программы (различные варианты синтаксических деревьев, т.к. с точки зрения семантического анализа основой является структура исходной программы).
Если семантический анализ выполняется на этапе синтаксического разбора, то каждый раз после завершения очередной конструкции выполняется семантическая проверка на основе имеющихся в ТИ данных.
Если семантический анализ выполняется на этапе подготовки к генерации кода после завершения всей фазы синтаксического анализа, выполняется полный семантический анализ (например, поиск неописанных идентификаторов).
Семантический анализ выполняется следующие основные действия:
1)Проверка соблюдения во входной программе семантических соглашений входного языка.
2)Дополнение внутреннего представления программы в компиляторе операторами и действиями, неявно предусмотренными семантикой входного языка.
3)Проверка элементарных смысловых норм языков программирования, напрямую не связанных с входным языком.
Проверка соблюдения во входной программе семантических соглашений входного языка:
Заключается в сопоставлении входных цепочек исходной программы с требованиями семантики входного языка программирования.
Каждый ЯП имеет четко заданные и специфицированные семантические соглашения, которые проверяются на этапе синтаксического разбора.
Например:
1)Каждая метка, на которую есть ссылка, должна хотя бы 1 раз присутствовать в программе.
2)Каждый идентификатор должен быть описан 1 раз и ни 1 идентификатор не может быть описан > 1 раза.
3)Типы переменных в выражениях должны быть согласованы между собой.
4)При вызове процедур и функций число и типы фактических параметров должны быть согласованы с числом и типами формальных параметров.
Проверка смысловых норм ЯП:
Напрямую не связана с входным языком – это сервисная функция, включенная практически во все современные компиляторы; она обеспечивает проверку компилятором соглашений, выполнение которых связано со смыслом либо всей программы в целом, либо е отдельных фрагментов.
Пример:
1)Каждая переменная или константа должна хотя бы 1 раз использоваться в программе.
2)Каждая переменная должна быть определена до ее первого использования, при любом ходе выполнения программы.
3)Результат функции должен быть определен при любом ходе ее выполнения.
4)Каждый оператор в исходной программе должен хотя бы 1 раз выполниться.
5)Операторы условия и выбора должны предусматривать возможность хода выполнения программы по каждой из своих ветвей.
6)Операторы цикла должны предусматривать возможность завершения цикла.
35. Фаза генерации кода.
Задача фазы генерации кода – это построение для программы на входном языке эквивалентной ей машинной программы.
В качестве входа для генерации кода служит некоторое промежуточное представления программы. Фаза генерации кода включает набор специфических (специальных) относительно независимых друг от друга подзадач:
1)Распределение памяти (распределение регистров).
2)Выбор команд.
3)Генерация объектного или загрузочного модуля.
Независимость данных задач относительна. Например, при выборе команд нельзя не учитывать схему распределения памяти, и наоборот.
В любой ситуации фаза генерации кода из префиксной записи отличается от генерации кода из ориентированного графа.