Условные операторы и описание простых типов языка Си. Предиктивный анализатор
Краткое сожержание материала:
Размещено на
АННОТАЦИЯ
Целью курсовой работы является:
- овладение и закрепление навыков построения лексического анализатора;
- овладение и закрепление навыков построения синтаксического анализатора;
- исследование принципов работы компилятора на каждом этапе обработки входной последовательности;
- овладение и закрепление навыков оформления документации;
- овладение и закрепление навыков трансляции в форму внутреннего представления: обратную польскую запись.
Перечень терминов:
ЛА - Лексический анализ
СА - Синтаксический анализ
ОПД - Обратная польская запись
ЯВУ - Язык высокого уровня
МП-автомат - автомат с магазинной памятью
ВВЕДЕНИЕ
Данный документ содержит описание и характеристику программы, написанной на основе задания на курсовую работу по теме «Условные операторы описание простых типов языка Си. Предиктивный анализатор».
В расчётно-пояснительной записке описывается функциональное назначение разработанной программы, приводится её логическая структура и используемые технические средства.
В приложении 1 приведено техническое задание на курсовую работу.
В приложении 2 содержатся блок-схемы алгоритмов программы.
Приложение 3 представляет собой руководство пользователя.
Приложение 4 содержит граф конечного автомата
Приложение 5 содержит листинг программы.
Данный программный продукт является программной реализацией компонентов транслятора (таких как лексический и синтаксический анализ) для некоторых конструкций языка программирования Си.
Использование этого программного средства направлено на:
- изучение принципов работы лексического анализатора,
- изучение принципов работы синтаксического анализатора,
- анализ принадлежности входных строк искомой грамматике,
- трансляцию заданной инструкции в форму внутреннего представления,
- оценку и исправление возможных ошибок,
в рамках учебного курса по дисциплине «Теория языков программирования и методов трансляции».
1. Общие сведения
Программный продукт предназначен для анализа входной последовательности символов на соответствие грамматике, указанной в техническом задании
1).. Программа позволяет:
? считать введенную пользователем конструкцию языка и провести лексический анализ этой конструкции, результатом которого является псевдокод;
? на основе построенной грамматики провести синтаксический анализ, результатом которого являются цепочка вывода и дерево вывода;
? транслировать инструкции в одну из форм внутреннего представления: обратную польскую запись.
Для работы программы необходима операционная система Windows 9x / Me / NT /XR. Программа также предусматривает работу с нестандартным компонентом dxOrgChart (производится вывод деревьев в удобной для просмотра форме), для чего потребуется установить в Delphi палитру компонентов ExpressOrgChart.
1.1 Функциональное назначение
Основными задачами, решение которых может быть произведено с помощью разработанной программной системы, являются:
· Перевод исходной программы на внутренний язык компилятора, т. е. лексическая обработка;
· Синтаксический анализ входной последовательности на соответствие грамматике;
· Построение дерева разбора, строки вывода синтаксического разбора;
· Построение обратной польской записи как формы внутреннего представления программы.
1.2 Описание логической структуры
1.2.1 Общая схема работы компилятора
Компиляторы составляют существенную часть программного обеспечения ЭВМ. Это связано с тем, что ЯВУ стали основными средствами разработки программ.
Общая схема работы компилятора показана на рис.1, из неё видно, что процесс компиляции состоит из двух основных этапов - анализа и синтеза.
Рис.1 Общая схема работы компилятора
На этапе анализа выполняется распознавание текста исходной программы, создание и заполнение таблиц идентификаторов. Результатом его работы служит некое внутреннее представление программы, понятное компилятору.
На этапе синтеза на основании внутреннего представления программы и информации, содержащейся в таблице (таблицах) идентификаторов, порождается текст результирующей программы. Результатом этого этапа является объектный код.
Кроме того, в составе компилятора присутствует часть, ответственная за анализ и исправление ошибок, которая при наличии ошибки в тексте исходной программы должна максимально полно информировать пользователя о типе ошибки и месте её возникновения. В лучшем случае компилятор может предложить вариант исправления ошибки.
Эти этапы, в свою очередь, состоят из более мелких этапов, называемых фазами компиляции.
Фазы компиляции.
Состав фаз компиляции приведён в самом общем виде, их конкретная реализация и процесс взаимодействия могут, конечно, различаться в зависимости от версии компилятора. Однако в том или ином виде все представленные фазы практически всегда присутствуют в каждом конкретном компиляторе.
a) Лексический анализ:
Это основная часть компилятора, которая читает литеры программы на исходном языке и строит из них слова (лексемы) исходного языка. На вход лексического анализатора поступает текст исходной программы, а выходная информация передаётся для дальнейшей обработки компилятором на этапе синтаксического разбора.
б) Синтаксический разбор
Это основная часть компилятора на этапе анализа. Она выполняет выделение синтаксических конструкций в тексте исходной программы, обработанной лексическим анализатором. На этой же фазе компиляции проверяется синтаксическая правильность программы.
в) Семантический анализ
Это часть компилятора, проверяющая правильность текста исходной программы с точки зрения семантики входного языка. Также семантический анализ должен выполнять преобразования текста, требуемые семантикой входного языка (такие, как добавление функций неявного преобразования типов). В различных реализациях компиляторов семантический анализ может частично входить в фазу синтаксического разбора, частично - в фазу подготовки к генерации кода.
г) Подготовка к генерации кода
Это фаза, на которой компилятором выполняются предварительные действия, непосредственно связанные с синтезом текста результирующей программы, но ещё не ведущие к порождению текста на выходном языке. Обычно в эту фазу входят действия, связанные с идентификацией элементов языка, распределением памяти и т.п.
д) Генерация кода
Это фаза, непосредственно связанная с порождением команд, составляющих предложения выходного языка и в целом текст результирующей программы. Это основная фаза на этапе синтеза результирующей программы. Кроме того, генерация обычно включает в себя также оптимизацию - процесс, связанный с обработкой уже порождённого текста. Иногда оптимизацию выделяют в отдельную фазу компиляции, так как она оказывает существенное влияние на качество и эффективность результирующей программы.
Таблицы идентификаторов - это специальным образом организованные наборов данных, служащие для хранения информации об элементах исходной программы, которые затем используются для порождения текста результирующей программы. Таблицы идентификаторов в конкретной реализации может быть одна или несколько.
1.2.2 Описание предметной области
Предметной областью являются конструкции условных операторов if-else и ?: и простые типы языка Си.
Данные операторы имеют следующий вид:
1) if условие оператор_1;
2) if условие оператор_1;
else оператор_2;
3) условие ? оператор_1;
4) условие ? оператор_1 : оператор_2;
Простые типы в языке Си объявляются так:
тип переменная_1, переменная_2, … переменная_n;
Рассмотрим элементы этих конструкций. Можно выделить следующие зарезервированные слова: if, else, ?, :.. После if находится выражение условие. Это выражение должно быть логического типа, т.е однозначно определяться как «истина» или «ложь». Если логическое выражение принимает значение «истина», то выполняется оператор оператор_1. Иначе, если есть зарезервированное слово else, то выполняется оператор оператор_2. В конструкции с оператором ?: перед зарезервированным словом ? находится выражение условие, которое также должно быть логического типа. Если это выражение принимает значение «истина», то выполняется оператор оператор_1. Иначе, если есть зарезервированное слово :, то выполняется оператор оператор_2. В описании переменных переменная_1, переменная_2, … переменная_n - список переменных в которых имена переменных разделены запятыми, тип - задает тип переменных из данного списка и является идентификатором типа.
1.2.3 Фаза компиляции «Лексический анализатор»
Лексический анализатор - это часть компилятора...
Синтаксический анализатор
Описание синтаксиса и семантики входного языка. Описание типов лексем, определение их синтаксиса. Построение диаграммы лексического анализатора, а так...
Язык программирования Pascal
История языка Pascal, его основные концепции. Линейный и циклический алгоритмы, типы данных. Условные операторы, операторы цикла. Программа вычисления...
Вводный курс в PHP
Синтаксис языка РНР, его переменные и чувствительность их имен к регистру. Гибкость в отношении типов переменных, преобразование типов. Набор основных...
Основы алгоритмизации и программирования
История развития языка программирования Pascal, его основные концепции. Вычисления в математических задачах. Изменение порядка выполнения инструкций п...
Структура языка SQL
Изучение и анализ функциональных возможностей СУБД. Структура языка реляционных БД SQL (Structured Query Language). Типы данных SQL. Операторы DDL - о...