Транслятор На Языке Курсовая

Транслятор На Языке Курсовая



➡➡➡ ПОДРОБНЕЕ ЖМИТЕ ЗДЕСЬ!






























Транслятор На Языке Курсовая
Методика разработки и частичная реализация транслятора для языка "С" с использованием языка "С++", производящего разбиение на минимальные неделимые конструкции языка исходной цепочки символов основываясь на лексике языка. Анализ работы программы.


посмотреть текст работы


скачать работу можно здесь


полная информация о работе


весь список подобных работ


Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Транслятор - обслуживающая программа, преобразующая исходную программу, предоставленную на входном языке программирования, в рабочую программу, представленную на объектном языке. Однако у каждой из таких программ могут иметься свои особенности по организации процесса трансляции. В настоящее время трансляторы разделяются на три основные группы: ассемблеры, компиляторы и интерпретаторы.
Компилятор - это обслуживающая программа, выполняющая трансляцию на машинный язык программы, записанной на исходном языке программирования. Компилятор обеспечивает преобразование программы с одного языка на другой (чаще всего, в язык конкретного компьютера). Вместе с тем, команды исходного языка значительно отличаются по организации и мощности от команд машинного языка. Существуют языки, в которых одна команда исходного языка транслируется в 7-10 машинных команд. Кроме того, в исходных языках достаточно часто используется строгая типизация данных, осуществляемая через их предварительное описание. Программирование может опираться не на кодирование алгоритма, а на тщательное обдумывание структур данных или классов. Процесс трансляции с таких языков обычно называется компиляцией, а исходные языки обычно относятся к языкам программирования высокого уровня (или высокоуровневым языкам). Абстрагирование языка программирования от системы команд компьютера привело к независимому созданию самых разнообразных языков, ориентированных на решение конкретных задач. Появились языки для научных расчетов, экономических расчетов, доступа к базам данных и другие. Структура компилятора с основными фазами компиляции показана на рисунке 1.1.
Лексический анализатор (известен также как сканер) осуществляет чтение входной цепочки символов и их группировку в элементарные конструкции, называемые лексемами. Каждая лексема имеет класс и значение. Обычно претендентами на роль лексем выступают элементарные конструкции языка, например, идентификатор, действительное число, комментарий. Полученные лексемы передаются синтаксическому анализатору. Сканер не является обязательной частью транслятора. Однако, он позволяет повысить эффективность процесса трансляции. Основным формализмом, лежащим в основе реализации лексических анализаторов, являются конечные автоматы и регулярные выражения. Лексический анализатор может работать в двух основных режимах: либо как подпрограмма, вызываемая синтаксическим анализатором за очередной лексемой, либо как полный проход, результатом которого является файл лексем. В процессе выделения лексем он может как самостоятельно строить таблицы имен и констант, так и выдавать значения для каждой лексемы при очередном обращении к нему. На этапе лексического анализа обнаруживаются некоторые (простейшие) ошибки (недопустимые символы, неправильная запись чисел, идентификаторов и др.).
Рисунок 1.1 . О бобщенная структура компилятора
Синтаксический анализатор осуществляет разбор исходной программы, используя поступающие лексемы, построение синтаксической структуры программы. Распознаватель получает цепочку лексем и на ее основе осуществляет разбор в соответствии с используемыми правилами. Лексемы, при успешном разборе правил, передаются семантическому анализатору, который строит таблицу имен и фиксирует фрагменты синтаксической структуры. Кроме этого, между таблицей имен и синтаксической структурой фиксируются дополнительные семантические связи. В результате формируется объектная модель программы, освобожденная от привязки к синтаксису языка программирования. Достаточно часто вместо синтаксической структуры, полностью копирующей иерархию объектов языка, создается ее упрощенный аналог, который называется промежуточным представлением. В процессе синтаксического анализа также обнаруживаются ошибки, связанные со структурой программы.
Анализатор ошибок получает информацию об ошибках, возникающих в различных блоках транслятора. Используя полученную информацию, он формирует сообщения пользователю. Кроме этого, данный блок может попытаться исправить ошибку, чтобы продолжить разбор дальше. На него также возлагаются действия, связанные с корректным завершением программы в случае, когда дальнейшую трансляцию продолжать невозможно.
На этапе семантического анализа выявляются зависимости между частями программы, которые не могут быть описаны контекстно-свободным синтаксисом. Это в основном связи «описание-использование», в частности анализ типов объектов, анализ областей видимости, соответствие параметров, метки и другие. В процессе контекстного анализа строится таблица символов, которую можно рассматривать как таблицу имен, пополненную информацией об описаниях (свойствах) объектов Результатом работы фазы контекстного анализа является атрибутированное дерево программы. Информация об объектах может быть как рассредоточена в самом дереве, так и сосредоточена в отдельных таблицах символов. В процессе контекстного анализа также могут быть обнаружены ошибки, связанные с неправильным использованием объектов.
Генератор кода строит код объектной машины на основе анализа объектной модели или промежуточного представления. Построение кода сопровождается дополнительным семантическим анализом, связанным с необходимостью преобразования обобщенных команд в коды конкретной вычислительной машины и их оптимизация. На этапе такого анализа окончательно определяется возможность преобразования, и выбираются эффективные варианты. Сама генерация кода является перекодировкой одних команд в другие.
Рисунок 3.1 - Ор ганизация взаимодействия блоков транслятора.
Лексический анализатор полностью обрабатывает исходный текст, формируя на выходе цепочку, состоящую из всех полученных лексем. Только после этого управление передается синтаксическому анализатору. Синтаксический анализатор получает сформированную цепочку лексем и на ее основе формирует промежуточное представление или объектную модель. После получения всей объектной модели он передает управление генератору кода. Генератор кода, на основе объектной модели языка, строит требуемый машинный код.
К достоинствам такого подхода можно отнести:
- Обособленность отдельных фаз, что позволяет обеспечить их независимую друг от друга реализацию и использование.
- Возможность хранения данных, получаемых в результате работы каждой из фаз, на внешних запоминающих устройствах и их использования по мере надобности.
- Возможность уменьшения объема оперативной памяти, требуемой для работы транслятора, за счет последовательного вызова фаз.
- Наличие больших объемов промежуточной информации, из которой в данный момент времени требуется только небольшая часть.
- Замедление скорости трансляции из-за последовательного выполнения фаз и использования для экономии оперативной памяти внешних запоминающих устройств.
- класс лексемы, определяющий общее название для категории элементов, обладающих общими свойствами (например, идентификатор, целое число, строка символов и т.д.);
- значение лексемы, определяющее подстроку символов входной цепочки, соответствующих распознанному классу лексемы. В зависимости от класса, значение лексемы может быть преобразовано во внутреннее представление уже на этапе лексического анализа. Так, например, поступают с числами, преобразуя их в двоичное машинное представление, что обеспечивает более компактное хранение и проверку правильности диапазона на ранней стадии анализа.
Выделяются методы непрямого и прямого лексического анализа. Непрямой лексический анализ, или лексический анализ с возвратами, заключается в последовательной проверке версий о классах лексем. Если проверка текущей версии не подтверждается, то происходит откат назад по цепочке символов и осуществляется проверка следующей версии. Прямой лексический анализ позволяет определить значение лексемы без откатов назад по цепочке символов.
Для данного транслятора был выбран прямой метод лексического анализа. Прямой лексический анализатор строится на основе одного детерминированного автомата, объединяющего множество автоматов, распознающих отдельные лексемы. Такой автомат на каждом шаге читает один входной символ и переходит в следующее состояние, приближающее его к распознаванию текущей лексемы или формированию ошибки. Для лексем, имеющих одинаковые подцепочки, автомат имеет общие фрагменты, реализующие единое множество состояний. Отличающиеся части реализуются своими фрагментами. Обобщенная структура прямого лексического анализатора приведена на рисунке 3.2.
Рисунок 3.2 - Пр ямой метод лексического анализа.
Он содержит входную головку, которая передает текущий входной символ в первое состояние одного из начальных блоков, реализующего фрагмент детерминированного автомата. Каждое из таких состояний распознает множество входных символов, не пересекающихся с множеством входных символов других состояний. Разбиение автомата на фрагменты проводится на основе выделения состояний, специализирующихся на распознавании общих или частных подцепочек отдельных лексем. В самом общем случае прямой лексический анализатор может рассматриваться как единый неструктурированный блок. Поэтому его дробление на отдельные блоки достаточно условно. Очередной символ читается обычно каждым состоянием автомата. В каждом фрагменте условно можно выделить начальное состояние, с которого начинается разбор подцепочки, закрепленной за фрагментом. Если символ не входит в группу, распознаваемых начальным состоянием фрагмента, то происходит отказ и передача управления начальному состоянию следующего альтернативного фрагмента, анализирующего другую группу входных символов. Если входной символ не может быть распознан другими состояниями фрагмента, то обработка отказа передается обработчику ошибок, который формирует ошибочную лексему и нейтрализует ошибку принятым способом. Передача управления обработчику ошибок осуществляется и в том случае, если все начальные состояния связанных между собой фрагментов формируют отказ. Разбор заканчивается выдачей распознанной или ошибочной лексемы.
Далее представим часть кода лексического анализатора (код главной функции и основных детерминированных автоматов по определению лексем). Имеется основная функция, которая передаёт управления вспомогательным функция для дальнейшего разбора в зависимости от встреченного символа. В вспомогательных функциях происходит распознавания лексемы (класса и типа) и заносится запись в таблицу лексем.
for ( int i = 1 ; i <= str . Length () ; i ++)
if ( isalpha ( str [ i ])|| str [ i ]== '_' )
i += Ident ( i )  - 1 ;  // идентификатор
else if ( isdigit ( str [ i ])|| str [ i ]== '.' || str [ i ]== '\'' )
i += Number ( i )  - 1 ;  // число else if ( str [ i ]== '\"' )
i += Strings ( i )  - 1 ;  // строка
else if ( str [ i ]== '/' &&( str [ i + 1 ]== '/' || str [ i + 1 ]== '*' ))
i += Comment ( i )  - 1 ;  // коментарий
else i += defSym ( i )  - 1 ;  // символ
AnsiString result = »» , tmp_s = »» ;
for ( int i = pos + 1 ; str [ i ]!= '\"' ; i ++)
{ result += '\a' ; len ++ ; b reak;}
{ result += '\b' ; len ++ ; b reak;}
{ result += '\f' ; len ++ ; b reak;}
{ result += '\n' ; len ++ ; b reak;}
{ result += '\r' ; len ++ ; b reak;}
{ result += '\t' ; len ++ ; b reak;}
{ result += '\v' ; len ++ ; b reak;}
case '\\' :case '\'' :case '\"' :case '\?' :
{ result += str [ i ] ; len ++ ; b reak;}
case '0' : { tmp_s = «0» ; len ++;
if ( LowerCase ( str [ i + 1 ])== 'x' )
for ( int j = i ; isdigit ( str [ j + 1 ])||( LowerCase ( str [ j + 1 ])>= 'a' && LowerCase ( str [ j + 1 ])<= 'f' ) ; tmp_s += str [ j + 1 ] , len ++ , j ++ , i ++){}
res_i = strtol ( tmp_s . c_str (),& endptr , 0 );
if ( res_i > 256 ) { PrintError ( «Диапазон Char» , pos ); break;}
if ( LowerCase ( str [ i + 1 ])!= 'x' )
for ( int j = i ; isdigit ( str [ j + 1 ]) ; j ++)
if ( str [ j + 1 ]>= '0' && str [ j + 1 ]<= '7' )
else { PrintError ( «Ошибка в управляющей последовательности!» , pos ) ; b reak ;}
res_i = strtol ( tmp_s . c_str (),& endptr , 0 );
if ( res_i > 256 ) { PrintError ( «Диапазон Char в последовательности» , pos ); break;}
default : PrintError ( «Ошибка в управляющей последовательности.» , pos );
else { result += str [ i ]; len ++;}
PrintError ( «Отсутствует конец строки» , pos );
ScanLEX -> Lex -> Add (new TLexema ( ltStr , lpNone , String ( result ) , pos , len ));
int TScan : Comment ( int pos )  // комментарий
{ if ( str [ i ]== '*' && str [ i + 1 ]== '/' ) b reak;
PrintError ( «Отсутствует конец комментария» , pos );
{for ( int i = pos + 1 ; str . SubString ( i , 2 )!= »\r\n» && i + 1 != str . Length () ; result += str [ i ] , i ++){}
Результат работы транслятора на фазе лексического анализа для тестового кода представлен на рисунке 3.3.
Рисунок 3.3 - Ре зультат транслятора на фазе лексического анализа.
Рисунок 3.4 - Ни сходящий разбор слева на право
bool TSyntax : sIf ( TTreeNode * n )
Synt -> ListBlock -> Add ( LastBlock );
TTreeNode * root = MainForm -> TreeView -> Items -> AddChild ( n , «IF» ) ;
if ( ! match ( ltBracket , lpLCirBracket )) return false;
TTreeNode * root2 = MainForm -> TreeView -> Items -> AddChild ( root , «условие» ) ;
if ( ! Lev1 ( root2 )) return false;
if ( ! match ( ltBracket , lpRCirBracket )) return false;
TTreeNode * root3 = MainForm -> TreeView -> Items -> AddChild ( root , «then» ) ;
if ( ! statement ( root3 )) { PrintError ( «Нет;» ); r eturn false;}
if ( match ( ltReservedWord , lpElse ))
TTreeNode * root4 = MainForm -> TreeView -> Items -> AddChild ( root , «else» ) ;
if ( ! statement ( root4 )) return false;
bool TSyntax : sFor ( TTreeNode * n )
Synt -> ListBlock -> Add ( LastBlock );
TTreeNode * root = MainForm -> TreeView -> Items -> AddChild ( n , «FOR» ) ;
if ( ! match ( ltBracket , lpLCirBracket )) return false;
if ( ! ( Lev1 ( root )&& match ( ltSepar , lpNone ))&& ! Declare ( root , f alse)) return false;
TTreeNode * root3 = MainForm -> TreeView -> Items -> AddChild ( root , «exit» ) ;
if ( ! Lev1 ( root3 )) return false;
if ( ! match ( ltSepar , lpNone )) { PrintError ( «Нет;» ) ; return false;}
if ( match ( ltBracket , lpRCirBracket ));
TTreeNode * root4 = MainForm -> TreeView -> Items -> AddChild ( root , «действия после цикла» );
if ( ! Lev0 ( root4 )) return false;
if ( ! match ( ltBracket , lpRCirBracket )) { PrintError ( «Нет)» ); r eturn false;}}
TTreeNode * root5 = MainForm -> TreeView -> Items -> AddChild ( root , «выполнить» ) ;
if ( ! statement ( root5 )) return false;
bool TSyntax : sWhile ( TTreeNode * n )
Synt -> ListBlock -> Add ( LastBlock );
TTreeNode * root = MainForm -> TreeView -> Items -> AddChild ( n , «WHILE» ) ;
if ( ! match ( ltBracket , lpLCirBracket )) { PrintError ( «Нет (» ); r eturn false;}
TTreeNode * root2 = MainForm -> TreeView -> Items -> AddChild ( root , «условие» ) ;
if ( ! Lev1 ( root2 )) return false;
if ( ! match ( ltBracket , lpRCirBracket )) { PrintError ( «Нет)» ); r eturn false;}
TTreeNode * root3 = MainForm -> TreeView -> Items -> AddChild ( root , «выполнить» ) ;
if ( ! statement ( root3 )) return false;
bool TSyntax : sCompose ( TTreeNode * n )
Synt -> ListBlock -> Add ( LastBlock );
TTreeNode * root = MainForm -> TreeView -> Items -> AddChild ( n , «операторные скобки» ) ;
for (; ! match ( ltBracket , lpRFigBracket );)
if ( ! statement ( root )) return false;
Результат работы транслятора на фазе синтаксического анализа для тестового кода представлен на рисунке 3.5.
Рисунок 3.5 - Ре зультат транслятора на фазе синтаксического анализа.
Проектирование лексического и синтаксического анализаторов учебного языка. Правила преобразования логических выражений в ПОЛИЗ. Формирование триад, оптимизация их списка. Логическая структура программы. Тестирование модулей транслятора-интерпретатора. курсовая работа [1,3 M], добавлен 28.05.2013
Транслятор как программа или техническое средство, выполняющее трансляцию программы. Рассмотрение основных особенностей постройки лексического анализатора. Знакомство с этапами разработки транслятора с ограниченного подмножества языка высокого уровня. курсовая работа [580,5 K], добавлен 06.08.2013
Написание транслятора посредством языка Си, обрабатывающего конструкции integer, if Le then, записи (record), а также реализующего обработку new для выделения динамической памяти: разработка алгоритма реализации задачи, представление листинга программы. курсовая работа [171,7 K], добавлен 03.07.2011
Методы грамматического разбора при разработке учебного транслятора. Проектирование лексического анализатора и магазинного автомата. Программная реализация синтаксического анализатора текстового языка высокого уровня. Разработка модуля интерпретации. курсовая работа [697,2 K], добавлен 06.01.2013
Понятие и принципы построения трансляторов. Методика написания программы на языке программирования С++, реализующей определенные действия над математическими выражениями. Написание транслятора с языка математических выражений на язык деревьев вывода. курсовая работа [423,3 K], добавлен 24.08.2009
Изучение текстового режима языка программирования Turbo Pascal. Написание игры "Змейка" с помощью средств, процедур и функций языка программирование Turbo Pascal. Структурное и функциональное описание разработки. Листинг и общие примеры работы программы. контрольная работа [286,3 K], добавлен 10.04.2011
Лингвистическая концепция языка Паскаль. Интегрированная инструментальная оболочка. Основы построения программ на ТП 7.0. Алфавит языка и специфика использования символов. Простые типы данных: константы и переменные. Циклические конструкции и операции. курсовая работа [284,6 K], добавлен 02.07.2011
Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д. PPT, PPTX и PDF-файлы представлены только в архивах. Рекомендуем скачать работу .

© 2000 — 2020, ООО «Олбест»
Все права защищены


Написание транслятора для языка С
Курсовая работа: Однопроходный/двухпроходный транслятор ...
Транслятор языка высокого уровня
Курсовая : "Разработка транслятора на языке Си..."
Курсовая работа (Теория) на тему "Учебный транслятор " скачать...
Сборник Сочинений По Литературе 11 Класс
На Один Из Жизни Феодала Сочинение
Сочинение По Теме Хороший Ли Человек Обломов
Сочинения По Сборнику Цыбулько Огэ 2021
Ораторское Искусство Эссе

Report Page