Изучение составных частей, основных принципов построения и функционирования компиляторов

Синтаксический разбор текста по заданной грамматике с построением дерева разбора. Назначение таблицы идентификаторов. Метод упорядоченного списка. Назначение лексического анализатора. Процесс программирования работы недетерминированного МП-автомата.

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 12.01.2014
Размер файла 1,4 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

СОДЕРЖАНИЕ

  • ВВЕДЕНИЕ
  • 1. ОПИСАНИЕ ВХОДНОГО ЯЗЫКА
  • 2. ОРГАНИЗАЦИЯ ТАБЛИЦЫ ИДЕНТИФИКАТОРОВ
    • 2.1 Назначение таблицы идентификаторов

2.2 Метод упорядоченного списка

2.3Результат выполнения программы

  • 3. ПРОЕКТИРОВАНИЕ ЛЕКСИЧЕСКОГО АНАЛИЗАТОРА
    • 3.1 Назначение лексического анализатора
    • 3.2 Граф переходов лексического анализатора
    • 3.3 Результат выполнения программы
  • 4. ПОСТРОЕНИЕ СИТАКСИЧЕСКОГО АНАЛИЗАТОРА
    • 4.1 Дерево вывода
    • 4.2 Синтаксический анализатор
    • 4.3 Таблицы предшествования
  • ЗАКЛЮЧЕНИЕ
  • СПИСОК ЛИТЕРАТУРЫ

ВВЕДЕНИЕ

Компилятор - программный модуль, задачей которого является перевод программы, написанной на одном из языков программирования (исходный язык) в программу на язык ассемблера или язык машинных команд.

Большинство компиляторов переводят программу с некоторого высокоуровневого языка программирования в машинный код, который может быть непосредственно выполнен компьютером.

Целью данной курсовой работы является изучение составных частей, основных принципов построения и функционирования компиляторов, практическое освоение методов построения составных частей компилятора для заданного входного языка.

Курсовая работа заключается в создании отдельных частей компилятора заданного языка.

В первой части работы ставится задача разработать программу, которая получает на входе набор идентификаторов, организует таблицу по заданному методу и позволяет осуществить многократный поиск идентификатора в этой таблице.

Во второй части работы требуется разработать программу, которая выполняет лексический анализ входного текста по заданной грамматике и порождает таблицу лексем с указанием их типов и значений.

В третьей части работы требуется разработать программу, которая на основании таблицы лексем выполняет синтаксический разбор текста по заданной грамматике с построением дерева разбора.

Результатами курсовой работы являются программная реализация заданного компилятора и пояснительная записка, оформленная в соответствии с требованиями стандартов и задания на курсовую работу.

В качестве среды разработка для реализации программы использован язык программирования C++ и среда программирования Visual Studio C++ 2012.

1. ОПИСАНИЕ ВХОДНОГО ЯЗЫКА

Входной язык представляет собой подмножество языка программирования Pascal.

Программа на данном языке может включать в себя символы латиницы, цифры, знак “ _ “, символьные константы, различные операторы. Текст на входном языке содержится в текстовом файле.

Набор идентификаторов организуются в таблицу по методу упорядоченного списка. Необходима возможность осуществления многократного поиска идентификатора в этой таблице. Список идентификаторов считать заданным в виде текстового файла. Длина идентификатора ограничена 32 символами. Он может включать в себя символы кириллицы и латиницы, цифры, знаки “ ^ ” и ” _ ”. Идентификатор не может начинаться с цифры.

Предусмотрены следующие варианты операторов входной программы:

- оператор присваивания (:=);

- зарезервированные слова If, Else, Then, While, Do, Prog, End;

- арифметические операции (+, -, /, *);

- операндами в выражениях могут выступать идентификаторы и константы (один символ, заключенный в одинарные кавычки);

- все идентификаторы должны восприниматься как переменные;

- допускается присутствие комментариев оформленных виде: //комментарий

Для выделения лексем заранее строится конечный автомат.

Данный язык относится к КС-языкам, поэтому может быть описан следующей грамматикой:

<буква>>”A” |….| ”Z” |….| ”a” |….| ”z” |”_”

<арифм.опер.>>”+” | ”-” | ”*” |”/

<цифра>>”0|1|2|3|4|5|6|7|8|9

< ID >><буква>

|<ID><буква>

|<ID><цифра>

<симв.конст.> >'<буква>'

|'<цифра>'

<операнд>><ID>

|< симв.конст.>

<арифм.выр.>> <операнд><арифм.оп.> <операнд>

<оператор>><оп.цикла>

|< оп.присв>

|<услов.оп>

<оп.присв.>><ID>”:=”<операнд>”;”

|<ID>”:=”<арифм.выр.>”;”

<блок опер.> ><оператор> ”;” <оператор>

|<блок>”;”<оператор>

<тело>>”{“<блок опер>”}”

<оп.цикла>> “do””{“ <тело> ”}” “while””(” <арифм.выр.>”)” ”;”

|“do””{“ <оператор> ”}” “while””(” <арифм.выр.>”)””;”

<услов.оп>> if “(”<арифм.выр>“)””then”<тело>”else”<тело>

|if “(” <арифм.выр>“)””then”<тело>

|if “(”<арифм.выр>“)”then”<оператор>”else”<оператор>

|if “(” <арифм.выр>“)””then”<оператор>

|if “(”<арифм.выр>“)””then”<оператор>”else”<тело>

|if “(”<арифм.выр>“)””then”<тело>”else”<оператор>

<прогр.>> “prog”<тело> “end

|“prog”<оператор> “end

Далее используя эту грамматику по методу сдвиг-свертка производится проверка входного языка на синтаксические ошибки.

2. ОРГАНИЗАЦИЯ ТАБЛИЦЫ ИДЕНТИФИКАТОРОВ

2.1 Назначение таблицы идентификаторов

Таблица используется на всех стадиях работы компилятора и формируется на этапе лексического анализа.

Проверка правильности семантики и генерация кода требуют знания характеристик идентификаторов, используемых в программе на исходном языке. Эти характеристики выясняются из описаний и из того, как идентификаторы используются в программе и накапливаются в таблице символов или таблице идентификаторов. Любая таблица символов состоит из набора полей, количество которых равно числу идентификаторов программы. Каждое поле содержит в себе полную информацию о данном элементе таблицы. Под идентификаторами подразумеваются переменные.

Основными характеристиками метода построения идентификаторов является скорость поиска, объем памяти. Оптимальное сочетание этих параметров определяет выбор метода. В данной работе используется метод упорядоченного списка.

2.2 Метод упорядоченного списка

Этот метод является простым методом построения таблиц идентификаторов. Элементы записываются в таблицу в порядке возрастания. Так как упорядочивание таблицы идентификаторов происходит на всех этапах обращения к таблице, то для ее построения можно пользоваться только алгоритмом прямого упорядоченного включения элементов. При добавлении нового элемента в таблицу идентификаторов он сначала добавляется в конец таблицы, а затем идет переупорядочивание элементов таблицы идентификаторов. Эффективным методом для поиска элементов является логарифмический поиск, на каждом шаге которого, число элементов, которые могут содержать искомый элемент, сокращается в два раза. Максимально число сравнений при поиске 1+log2(N).

Схема алгоритма добавления идентификатора представлена на рис. 1

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Рисунок 1 - Алгоритм добавления идентификатора

Схема алгоритма поиска идентификатора представлена на рис. 2

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Рисунок 2 - Алгоритм поиска идентификатора

2.3 Результат выполнения программы

В результате работы было выявлено, что недостатком такого метода является требование упорядочивания таблицы идентификаторов на всех этапах обращения к этой таблице.

К положительным качествам метода можно отнести простоту его организации.

3. ПРОЕКТИРОВАНИЕ ЛЕКСИЧЕСКОГО АНАЛИЗАТОРА

3.1 Назначение лексического анализатора

Лексический анализатор (или сканер) - это часть компилятора, которая читает литеры программы на исходном языке и строит из них слова (лексемы) исходного языка. На вход лексического анализатора поступает текст исходной программы, а выходная информация передается для дальнейшей обработки компилятором на этапе синтаксического анализа и разбора.

В основном лексические анализаторы выполняют исключение из текста исходной программы комментариев и незначащих пробелов, а также выделение лексем следующих типов: идентификаторов, строковых, символьных и числовых констант, ключевых (служебных) слов входного языка.

3.2 Граф переходов лексического анализатора

Распознаватель лексем языка для данной грамматики задан конечным детерминированным автоматом, схема которого представлена на рисунках 3, 4 и 5.

Рисунок 3 - Схема распознавателя 1

Рисунок 4 - Схема распознавателя 2

Рисунок 5 - Схема распознавателя 3

Легенда:

V - любой определенный алфавитно-цифровой символ (буквы латинского алфавита, знак «_», десятичные цифры);

V(*) - любой символ кроме перечисленных в скобках;

B - буквы латинского алфавита и знак «_»;

B(*) - любая буква кроме перечисленных в скобках;

Р - пробел, табуляция, перенос строки;

D - недопустимые символы;

F - сохранение (ID - в таблице идентификаторов; L -в таблице лексем);

e - ошибка;

s - имя лексемы;

Состояния соответствуют:

Н - начальное состояние;

К - конечное состояние;

P1, P2, P3, P4 - состояния, соответствующие ключевому слову “prog”;

En1, En2 - состояния, соответствующие ключевому слову “end”;

I1, I2 - состояния, соответствующие ключевому слову “if”;

E1, E2, E3, E4 - состояния, соответствующие слову “else”;

T1, T2, T3, T4 - состояния, соответствующие слову “then”;

W1, W2, W3, W4, W5 - состояния, соответствующие ключевому слову “while”;

D1, D2 - состояния, соответствующие ключевому слову “do”;

S1, S2, S3 - состояния, соответствующие символьное константе:

A1, A2 - состояния, соответствующие оператору присваивания “:=”;

С1, С2 - комментарий;

Программа, реализованная на основе данного автомата, выполняет лексический анализ текста программы на заданном языке.

3.3 Результат выполнения программы

Результат разбора входных выражений на лексемы представлен на рисунке 6.

Рисунок 6 - Результат работы лексического анализатора (таблица лексем)

Спроектированный лексический анализатор выполняет лексический анализ входного текста в соответствии с заданной грамматикой и порождает таблицу лексем с указанием их типов. Программа выводит также сообщения о наличие во входном тексте ошибок. Этот алгоритм послужит в дальнейшем базой для построения дерева вывода в 3 части курсовой работы.

4. ПОСТРОЕНИЕ СИТАКСИЧЕСКОГО АНАЛИЗАТОРА

4.1 Дерево вывода

Лексический анализатор выделяет в тексте лексемы языка. Полученная после лексического анализа цепочка во второй части программы рассматриваться в соответствии с алгоритмом разбора. После построения цепочки вывода на ее основе строится дерево разбора.

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

Длину идентификаторов и строковых констант считать ограниченной 32 символами.

4.2 Синтаксический анализатор

лексический компилятор программирование

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

Программирование работы недетерминированного МП-автомата - это сложная задача. Разработанный алгоритм, позволяет для произвольной КС-грамматики определить, принадлежит ли ей заданная входная цепочка (алгоритм Кока-Янгера-Касами).

Доказано, что время работы этого алгоритма пропорционально n3, где n - длина входной цепочки. Для однозначной КС-грамматики при использовании другого алгоритма (алгоритм Эрли) это время пропорционально n2. Подобная зависимость делает эти алгоритмы требовательными к вычислительным ресурсам. На практике и не требуется анализ цепочки произвольного КС-языка - большинство конструкций языков программирования может быть отнесено в один из классов КС-языков, для которых разработаны алгоритмы разбора, линейно зависящие от длины входной цепочки.

КС-языки делятся на классы в соответствии со структурой правил их грамматик. В каждом из классов налагаются дополнительные ограничения на допустимые правила грамматики.

Одним из таких классов является класс грамматик предшествования. Они используются для синтаксического разбора цепочек с помощью алгоритма “сдвиг-свертка”. Выделяют следующие типы грамматик предшествования:

- простого предшествования;

- расширенного предшествования;

- слабого предшествования;

- смешанной стратегии предшествования;

- операторного предшествования.

Алгоритм построения синтаксического анализатора включает следующие этапы:

1) составление правил грамматики языка;

2) выявление множества крайних правых и кайних левых терминальных и нетерминальных символов;

3) построение матрицы предшествования.

Рассмотрим эти этапы более подробно.

4.3 Таблицы предшествования

Множество правил грамматики имеет вид:

<буква>>”A” |….| ”Z” |….| ”a” |….| ”z” |”_”

<арифм.опер.>>”+” | ”-” | ”*” |”/”

<цифра>>”0”|”1”|”2”|”3”|”4”|”5”|”6”|”7”|”8”|”9”

< ID >><буква>

|<ID><буква>

|<ID><цифра>

<симв.конст.> >'<буква>'

|'<цифра>'

<операнд>><ID>

|< симв.конст.>

<арифм.выр.>> <операнд><арифм.оп.> <операнд>

<оператор>><оп.цикла>

|< оп.присв>

|<услов.оп>

<оп.присв.>><ID>”:=”<операнд>”;”

|<ID>”:=”<арифм.выр.>”;”

<блок опер.> ><оператор> ”;” <оператор>

|<блок>”;”<оператор>

<тело>>”{“<блок опер>”}”

<оп.цикла>> “do””{“ <тело> ”}” “while””(” <арифм.выр.>”)” ”;”

|“do””{“ <оператор> ”}” “while””(” <арифм.выр.>”)””;”

<услов.оп>> if “(”<арифм.выр>“)””then”<тело>”else”<тело>

|if “(” <арифм.выр>“)””then”<тело>

|if “(”<арифм.выр>“)”then”<оператор>”else”<оператор>

|if “(” <арифм.выр>“)””then”<оператор>

|if “(”<арифм.выр>“)””then”<оператор>”else”<тело>

|if “(”<арифм.выр>“)””then”<тело>”else”<оператор>

<прогр.>> “prog”<тело> “end

|“prog”<оператор> “end

Грамматика является грамматикой операторного предшествования, так как она не содержит -правил и правые части правил не содержат смежных нетерминальных символов. Построим множества крайних левых и крайних правых символов L(U), R(U) относительно всех нетерминальных символов грамматики.

Таблица 3.1 - Множества крайних правых и крайних левых символов

Символ (U)

Начало построения

L(U)

R(U)

<элемент>

<число>,ID, <элемент>

<число>,ID

<лев.выр>

<элемент>,<лев.выр>

<элемент>,<число>

<выр>

<лев.выр>

”;”

<сис.уравн>

<сис.уравн>,<выр>

<выр>

На основе полученных множеств построим множества крайних левых и крайних правых терминальных символов Lt(U), Rt(U) относительно всех нетерминальных символов грамматики.

Таблица 3.2 - Множества крайних правых и крайних левых терминальных символов

Символ (U)

Начало построения

L(U)

R(U)

<элемент>

<число>,ID

<число>,ID

<лев.выр>

<число>,ID

<число>,ID

<выр>

<число>,ID

”;”

<сис.уравн>

<число>,ID

”;”

На основе этих множеств и правил грамматики G построим матрицу предшествования грамматики:

Таблица 3.3 - Матрица предшествования исходной грамматики

константа

переменная.

;

=

-

+

*

/

константа

-

-

<

<

<

<

<

-

переменная

-

-

-

<

<

<

<

<

;

<

<

-

-

-

-

-

-

=

<

-

-

-

-

-

-

-

-

<

<

-

-

-

-

-

-

+

<

<

-

-

-

-

-

-

*

<

<

-

-

-

-

-

-

/

<

<

-

-

-

-

-

-

На основе матрицы предшествования производится синтаксический анализ методом “сдвиг-свертка” в результате которого формируется матрица коэффициентов для дальнейшего решения методом Гаусса.

ЗАКЛЮЧЕНИЕ

В результате выполнения курсовой работы для заданного входного языка были построены отдельные части компилятора.

В первой части работы был разработан программа, которая получает на входе набор идентификаторов, организует таблицу идентификаторов методом упорядоченного списка, позволяет осуществить многократный поиск идентификатора в этой таблице.

Во второй части работы была написана программа, которая выполняет лексический анализ входного текста и порождает таблицу лексем с указанием их типов и значений.

Третья часть курсовой работы была посвящена разработке программы, которая порождает таблицу лексем и выполняет синтаксический разбор текста с построением дерева разбора.

Отдельные части компилятора, разработанные в данной курсовой работе, дают представление о технике и методах, лежащих в основе построения компиляторов.

СПИСОК ЛИТЕРАТУРЫ

1. Гордеев А. В. Молчанов Л. Ю. Системное программное обеспечение, - СПб.: Питер. 2002. - 734с.

2. Кампапиец Р. II. Манькоп Е. В., Филатов Н. Е. Системное программирование. Основы построения трансляторов: Учеб. пособие для высших и средних учебных заведений. - СПб.: КОРОНА Принт, 2000. -256 с.

3. Гордеев А. В. Операционные системы: Учебник для вузов.

2-е изд.-СПб.: Питер, 2004. - 416 с.

4. Олифер В. Г., Олифер Н.А. Сетевые операционные системы. - СПб.: Питер. 2002. - 544 с.

Размещено на Allbest.ru

...

Подобные документы

  • Составные части, основные принципы построения и функционирования компиляторов. Практическое освоение методов разработки их составных частей. Этапы и особенности создания программы для выполнения лексического анализа входного текста по заданной грамматике.

    курсовая работа [294,0 K], добавлен 04.11.2014

  • Организация таблицы идентификаторов, ее содержание и назначение. Метод бинарного дерева и цепочек. Проектирование лексического анализатора и схема распознавателя. Построение дерева вывода, синтаксический анализатор. Анализ результатов работы программы.

    курсовая работа [1,0 M], добавлен 25.12.2014

  • Проектирование программы-анализатора, состоящей из двух частей: лексического анализатора, разбивающего исходный текст программы на лексемы и заполняющего таблицу имен; синтаксического анализатора, проверяющего соответствие текста заданной грамматике.

    курсовая работа [2,0 M], добавлен 14.06.2010

  • Назначение, принципы и методы построения таблиц идентификаторов. Метод простого рехэширования с помощью произведения. Назначение лексического анализатора. Таблица лексем и содержащаяся в ней информация. Построение лексических анализаторов (сканеров).

    курсовая работа [703,1 K], добавлен 08.02.2011

  • Место компилятора в программном обеспечении. Принципы работы и автоматизация построения синтаксического анализатора. Дерево разбора и его преобразование в дерево операций. Назначение и этапы семантического анализа. Идентификация языков программирования.

    реферат [265,1 K], добавлен 20.12.2007

  • Методы грамматического разбора при разработке учебного транслятора. Проектирование лексического анализатора и магазинного автомата. Программная реализация синтаксического анализатора текстового языка высокого уровня. Разработка модуля интерпретации.

    курсовая работа [697,2 K], добавлен 06.01.2013

  • Конструкции условных операторов if-else и простые типы языка Си. Общая схема работы компилятора. Алгоритм построения дерева разбора, строки вывода синтаксического разбора. Построение обратной польской записи как формы внутреннего представления программы.

    курсовая работа [1,3 M], добавлен 01.06.2013

  • Принцип работы компиляторов. Синтаксически-неоpиентиpованные алгоритмы, достоинства этого класса. Метод нисходящего разбора - рекурсивный спуск, суть данного метода. Преобразования программы компилятором с реализацией работы с процедурами с параметрами.

    курсовая работа [31,6 K], добавлен 25.03.2011

  • Построение праволинейной грамматики, автоматной грамматики по полученным результатам. Построение недетерминированного конечного автомата. Сведение недетерминированного конечного автомата к детерминированному. Описание программы и контрольного примера.

    курсовая работа [674,9 K], добавлен 13.06.2012

  • Общая характеристика и оценка возможностей языка программирования си-шарп, его сходные и отличительные черты от С++ и Java. Разработка с помощью данного языка программирования лексического и синтаксического анализатора. Составление таблиц разбора.

    курсовая работа [111,6 K], добавлен 11.06.2010

  • Написание программы, которая выполняет лексический и синтаксический анализ входного языка программирования, порождает таблицу лексем с указанием их типов и значений, а также строит синтаксическое дерево; текст входного языка вводится с клавиатуры.

    курсовая работа [761,5 K], добавлен 23.02.2012

  • Создание алгоритма для построения синтаксического анализатора полиномов и его реализация в среде Visual Studio 2005 на языке программирования C#. Программное решение задачи поиска максимального числа единиц в бинарном представлении простых чисел.

    курсовая работа [723,5 K], добавлен 04.10.2010

  • Методика минимизации абстрактного автомата. Порядок построения графа полученного минимизированного автомата. Синтез на элементах ИЛИ-НЕ и Т-тригерах. Составление таблицы переходов. Разработка микропрограммного автомата, реализующего микропрограмму.

    курсовая работа [997,7 K], добавлен 28.03.2011

  • Особенности задач линейного программирования. Симплексный метод решения задач линейного программирования. Обоснование выбора языка, инструментария программирования, перечень идентификаторов и блок-схема алгоритма. Логическая схема работы программы.

    дипломная работа [2,4 M], добавлен 13.08.2011

  • Описание синтаксиса и семантики входного языка. Описание типов лексем, определение их синтаксиса. Построение диаграммы лексического анализатора, а также его таблицы, тестирование. Построение КС-грамматики входного языка. Описание промежуточного языка.

    курсовая работа [83,0 K], добавлен 23.01.2014

  • Сведение недетерминированного конечного автомата к детерминированному. Построение минимального детерминированного автомата из праволинейной грамматики двумя различными способами: с помощью сетей Петри и с помощью таблиц. Описание контрольного примера.

    курсовая работа [903,9 K], добавлен 14.07.2012

  • Составление треугольной таблицы. Нахождение списка максимальных классов совместимости, минимального замкнутого покрытия. Получение логических функций выходов автомата. Синтез конечного автомата и функциональной схемы. Принципиальная электрическая схема.

    контрольная работа [215,8 K], добавлен 22.06.2012

  • Разработка управляющего автомата, ориентированного на выполнение заданной микрооперации. Разработка алгоритма работы управляющего автомата. Листинг программы. Выбор оптимального варианта кодирования состояний автомата. Синтез функции возбуждения.

    курсовая работа [506,9 K], добавлен 26.12.2012

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

    курсовая работа [210,8 K], добавлен 05.12.2013

  • Составление формальной грамматики, недетерминированный конечный автомат. Построение конечного автомата, программное моделирование работы конечного автомата. Граф детерминированного автомата, Синтаксическая диаграмма. Блок-схемы, примеры разбора строк.

    курсовая работа [486,2 K], добавлен 19.11.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.