Разработка транслятора на языке Си - Программирование, компьютеры и кибернетика курсовая работа
Изучение устройства и механизма процессов в компиляторах и интерпретаторах. Понятие трансляции как процедуры перевода программного кода с языка Паскаль на язык С++. Описание интерфейса программы и автоматизация процесса построения диаграммы классов.
посмотреть текст работы
скачать работу можно здесь
полная информация о работе
весь список подобных работ
Нужна помощь с учёбой? Наши эксперты готовы помочь!
Нажимая на кнопку, вы соглашаетесь с
политикой обработки персональных данных
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Министерство образования и науки Российской Федерации Государственное образовательное учреждение высшего профессионального образования "Северо-Кавказский Государственный Технический Университет"
Факультет информационных технологий и телекоммуникаций
по дисциплине "Программирование на языке высокого уровня"
Таблица 1 - Таблица эквивалентных конструкций
var "name": "type"; "name", "name": "type";
"type" "name", "name"; "type" "name";
{ комментарий 1 } (*комментарий 2*)
/*комментарий 1*/ /*комментарий 2*/
Ниже приведен пример работы транслятора с языка программирования Пскаль на язык С++.
Программа представляет собой исполняющий файл p2c.exe. При запуске программы открывается окно, изображенное на рисунке 3.
Для работы программы необходимо, что бы в папке с исполняющим файлом находился текстовый документ с именем "CodePas.txt", содержащий исходный код на языке программирования Паскаль.
В случае отсутствия соответствующего файла, программа при запске выдаст сообщение об ошибке (см. рисунок 4).
В окне программы расположены два элемента "Edit Box", в которые выводится исходный и преобразованный код. Эти элементы защищены от редактирования пользователем, т.к. по условию курсового проекта исходный код должен читаться из файла и преобразованный код тоже выгружаться в файл.
Также, в окне программы расположены две кнопки "Translate" и "Close". При нажатии на кнопку "Translate" запускается серия подпрограмм, которые осуществляют трансляцию исходного кода. При нажатии на кнопку "Close" окно программы закрывается.
Аппаратные и системные требования для запуска программы: ОС Windows XP, Windows Vista и 7. Процессор не менее 1 ГГц, ОЗУ 256Мб и более. Также необходима установка библиотеки компонентов Microsoft Net.Framework 2.0.
Семантика языков программирования изменяется в очень широких пределах. Они отличаются не только по особенностям реализации отдельных операций, но и по парадигмам программирования, определяющим принципиальные различия в методах разработки программ. Специфика реализации операций может касаться как структуры обрабатываемых данных, так и правил обработки одних и тех же типов данных. Большинство языков работают в основном со скалярами, предоставляя для обработки массивов процедуры и функции, написанные программистами. Но даже при выполнении операции сложения двух целых чисел такие языки, как C++ и Паскаль могут вести себя по-разному. Наряду с традиционным процедурным программированием, называемым также императивным, существуют такие парадигмы как функциональное программирование, логическое программирование и объектно-ориентированное программирование. Структура понятий и объектов языков сильно зависит от избранной парадигмы, что также влияет на реализацию транслятора. Даже один и тот же язык может быть реализован нескольким способами. Это связано с тем, что теория формальных грамматик допускает различные методы разбора одних и тех же предложений. В соответствии с этим трансляторы разными способами могут получать один и тот же результат (объектную программу) по первоначальному исходному тексту. Вместе с тем, все языки программирования обладают рядом общих характеристик и параметров. Эта общность определяет и схожие для всех языков принципы организации трансляторов.
1. Языки программирования предназначены для облегчения программирования. Поэтому их операторы и структуры данных более мощные, чем в машинных языках.
2. Для повышения наглядности программ вместо числовых кодов используются символические или графические представления конструкций языка, более удобные для их восприятия человеком.
- Множество символов, которые можно использовать для записи правильных программ (алфавит), основные элементы.
- Множество правильных программ (синтаксис).
- "Смысл" каждой правильной программы (семантика).
Язык программирования, как и любая сложная система, определяется через иерархию понятий, задающую взаимосвязи между его элементами. Эти понятия связаны между собой в соответствии с синтаксическими правилами. Каждая из программ, построенная по этим правилам, имеет соответствующую иерархическую структуру.
При запуске программы исходный текстовый файл считывается построчно и записывается в массив с именем CodeP типа CString. Массив ограничен 100 элементами, а значит, что длина исходного кода не должна превышать 100 строк. Далее каждая строчка массива анализируется несколькими подпрограммами и уже в преобразованном виде записывается в массив CodeC типа CString. После завершения работы всех анализирующих подпрограмм, массив CodeC построчно записывается в файл результата и выводится в окне "Edit".
5. Структура программы и описание функций и операторов
Структуру классов программы очень удобно просмотреть в закладке "Class View" среды MS Visual Studio 2008. В этой среде автоматизирован процесс построения диаграммы классов для того, чтобы наглядней можно было проследить наследование (см. рисунок - 5).
Рисунок 5 - Диаграмма классов программы
fRead - данная подпрограмма производит построчное считывание информации из текстового файла. Считанная информация записывается в строковый массив и выводится на экран.
fWrite - подпрограмма производит выгрузку обработанного текста в файл, а также вывод результата транслирования на экран.
fMain - производит поиск и замену операторных скобок, а также вставляет функцию "void main()".
fComment - производит поиск и замену комментариев, в соответствии с синтаксисом языка программирования С++.
fvar - данная подпрограмма производит поиск и обработку объявления переменных типа integer, а также объявления массивов. В данной подпрограмме также реализован поиск и замена оператора присваивания.
fWhile - данная подпрограмма ищет и модифицирует оператор цикла "while", а также основные логические операторы приводит в соответствие с синтаксисом языка С++.
CString CodeP[n] - Строковый массив, в который с помощью функции fRead() помещается исходный код на языке Паскаль, который содержится в текстовом файле
CString CodeC[n] - Строковый массив, который содержит результат транслирования исходного кода на языке Паскаль в исходный код на языке С++. Содержимое этого массива построчно выводится в файл.
CString* pCodeC - Указатель на строку в строковом массиве. Передается функциям в качестве аргумента.
CString* pCodeP - Указатель на строку в строковом массиве. Передается функциям в качестве аргумента.
CString szOut - Результирующая строка. Необходима для вывода содержимого исходного файла и результатов транслирования в диалоговое окно программы. Функции и процедуры:
ATL::CString::Append(CString str) - Данная функция добавляет строку str в конец текущей строки.
ATL::CString::AppendChar(char chr) - Данная функция добавляет символ chr в конец текущей строки.
ATL::CString::Find(CString str) - Ищет первое совпадение в текущей строке с символами строки str. Функция возвращает порядковый номер первого символа совпавшей комбинации.
ATL::CString::Delete(int k, const 1) - Удаляет колличество символов, указонное во втором аргументе, начиная с k-го символа.
ATL::CString::Insert(int k, CString str) - Вставляет подстроку str в текущую строку начиная с символа k.
ATL::CString::GetLength() - Возвращает длину текущей строки.
// p2c.h : main header file for the PROJECT_NAME application
#error "include 'stdafx.h' before including this file for PCH"
#include "resource.h"// main symbols
// See p2c.cpp for the implementation of this class
Заголовочный файл диалогового окна p2cDlg.h
Cp2cDlg(CWnd* pParent = NULL);// standard constructor
CString CodeC[100];//Объявляем строковой массив из 100 элементов, для хранения исходного кода на С++.
CString* pCodeP;//Указатель на массив CodeC
CString CodeP[100];//Объявляем строковой массив из 100 элементов, для хранения исходного кода на Паскале.
CString* pCodeC;//Указатель на массив CodeP
virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support
void fRead(UINT nID, CString* String);
void fWrite(UINT nID, CString* String);
Исполняющий файл приложения p2c.cpp
// p2c.cpp : Defines the class behaviors for the application.
BEGIN_MESSAGE_MAP(Cp2cApp, CWinApp)
ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
// TODO: add construction code here,
// Place all significant initialization in InitInstance
// InitCommonControlsEx() is required on Windows XP if an application
// manifest specifies use of ComCtl32.dll version 6 or later to enable
// visual styles. Otherwise, any window creation will fail.
InitCtrls.dwSize = sizeof(InitCtrls);
// Set this to include all the common control classes you want to use
InitCtrls.dwICC = ICC_WIN95_CLASSES;
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need
// Change the registry key under which our settings are stored
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
// TODO: Place code here to handle when the dialog is
// TODO: Place code here to handle when the dialog is
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
Исполняющий файл диалогового окна p2cDlg.cpp
// p2cDlg.cpp : implementation file
Cp2cDlg::Cp2cDlg(CWnd* pParent /*=NULL*/)
pCodeP=&CodeP[0];//Создаем указатели на нулевые строки массивов.
for (int i=0; i<100; i++)//Инициализируем элементы строковых массивов пустыми значениями.
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
void Cp2cDlg::DoDataExchange(CDataExchange* pDX)
BEGIN_MESSAGE_MAP(Cp2cDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, &Cp2cDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &Cp2cDlg::OnBnClickedButton2)
fRead(IDC_EDIT1,pCodeP);//Первый аргумент - элемент диалога,
//в который будет выводиться текст, второй - указатель на массив строк.
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);// Set big icon
SetIcon(m_hIcon, FALSE);// Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// The system calls this function to obtain the cursor to display while the user drags
return static_cast(m_hIcon);
void Cp2cDlg::OnBnClickedButton1()//Обработчик нажатия на кнопку.
{ int i=0;//Объявляем и инициализируем счетчик.
while (CodeP[i]!="")//Пока элемент массива не пустой
CodeC[i]=CodeP[i];//Присваиваем строки
CString* pTemp=&CodeC[i];//Создаем временный указатель на текущую строку.
fComment(pTemp);//Запускаем функции, передавая в кач-ве аргумента указатель на текущую строку.
fWrite(IDC_EDIT2,pCodeC);//Вызываем функцию вывода результата и записи его в файл
void Cp2cDlg::fRead(UINT nID, CString* String)//Функция производит чтение строк из файла.
//Она же построчно заносит содержимое файла в строковый массив.
CString szOut=""; //Создаем пустую строку, для вывода результата.
CStdioFile Inputfile; //Создаем объект для файла.
CFileException FileExc; //Объект исключений для файла
if (!Inputfile.Open("CodePas.txt", nOpenFlags, &FileExc))
FileExc.ReportError();//Выводим стандартное сообщение об ошибке
String[i]=s;//Присваиваем строку из файла элементу строкового массива.
szOut.Append(String[i]);//Добавляем текущую строку в строку результата.
szOut.AppendChar('\r');//Добавляем разрывы строки
szOut.AppendChar('\n');//Добавляем разрывы строки
Inputfile.Close();//Закрываем текстовый файл.
SetDlgItemText(nID,szOut);//Выводим текст в элемент диалогового окна.
void Cp2cDlg::fWrite(UINT nID, CString* String)//Функция производит запись результата в файл.
CString szOut="";//Создаем пустую строку, для вывода результата.
CStdioFile Outputfile;//Создаем объект для файла.
CFileException FileExc; //Объект исключений для файла
nOpenFlags = CFile::modeWrite | CFile::modeCreate;//Создаем файл
if (!Outputfile.Open("CodeC.txt", nOpenFlags, &FileExc))
FileExc.ReportError();//Выводим стандартное сообщение об ошибке
while (String[i]!="")//Пока строка не пуста
szOut.Append(String[i]);//Добавляем текущую строку в строку результата.
szOut.AppendChar('\r');//Добавляем разрывы строки
szOut.AppendChar('\n');//Добавляем разрывы строки
Outputfile.WriteString(String[i]+'\n');//Записываем строку в файл, добавляя \n в конец.
Outputfile.Close();//Закрываем файл
SetDlgItemText(nID,szOut);//Выводим текст в элемент диалогового окна.
void Cp2cDlg::fComment(CString* String)//Функция для обработки комментариев.
{ int nach=-1,kon=-1;//Переменные, в которых будет храниться порядковый номер определенных комбинаций символов.
nach=String->Find("{");//Присваиваем переменной номер искомого символа, если символ присутствует в строке,
if (nach>=0)//Если символ присутствует
String->Insert(nach,'/');//Вставляем необходимые символы
String->Delete(nach+2,1);//Удаляем скобки комментариев на языке Паскаль.
kon=String->Find("}");//Аналогичные действия, только для закрывающихся скобок.
nach=String->Find("(*");//Выполняем аналогичные действия с другим видом комментариев на Паскале.
void Cp2cDlg::fvar(CString* String)//Функция обрабатывает объявление переменных и массива целочисленного типа и оператора присваивания.
int rav=-1,inte=-1,arr=-1,var=-1;//Переменные, в которых будет храниться порядковый номер определенных комбинаций символов.
rav=String->Find(":=");//Ищем оператор присваивания
var=String->Find("var");//Ищем объявление переменных
String->Delete(rav,2);//Удаляем оператор присваивания
String->Delete(var,4);//Удаляем оператор объявления переменных VAR.
inte=String->Find("integer");//Ищем объявление целочисленного типа
String->Delete(inte,7);//Удаляем объявление целочисленного типа
String->Delete(String->Find(":"));//Удаляем лишние символы
String->Insert(0,"int ");//Вставляем в начало строки объявление целочисленного типа для С++
arr=String->Find("array");//Ищем объявление массива
String->Delete(arr,5);//Удаляем array
String->Delete(String->Find("of"),2);//Удаляем лишние символы
String->Delete(String->Find("..")-1,1);
String->Delete(String->Find(".."),2);
void Cp2cDlg::fMain(CString* String)//Функция ищет и заменяет операторные скобки и объявляет функцию void main()
int prg=-1,beg=-1,end=-1,end1=-1; //Переменные, в которых будет храниться порядковый номер определенных комбинаций символов.
prg=String->Find("program");//Производим поиск ключевых слов
String->Delete(0,String->GetLength());//Очищаем строку
String->Append("void main(void)");//Вставляем объявление ф-ции void main()
String->Delete(beg,5);//Удаляем операторные скобки на языке Паскаль
String->Insert(beg,"{");//Вставляем операторные скобки на языке С++
String->Delete(end,4);//Удаляем операторные скобки на языке Паскаль
String->Insert(end,"}");//Вставляем операторные скобки на языке С++
String->Delete(end,4);//Удаляем операторные скобки на языке Паскаль
String->Insert(end,"}");//Вставляем операторные скобки на языке С++
void Cp2cDlg::fWhile(CString* String)//Функция обрабатывает цикл while и логические операторы
int wh=-1,le1=-1,le2=-1;//Переменные, в которых будет храниться порядковый номер определенных комбинаций символов.
wh=String->Find("while");//Производим поиск ключевых слов
String->Insert(String->Find("do")-1,")");
String->Delete(String->Find("do"),2);
le1=String->Find("<>");//Производим поиск логического оператора "не равно"
String->Insert(String->Find("<>"),"!=");//Вставляем логический оператор "не равно" на языке С++
String->Delete(String->Find("<>"),2);//Удаляем логический оператор "не равно" на языке Паскаль
le2=String->Find("=");//Производим поиск логического оператора "равно"
if (String->Find(":")<0 || String->Find("!")<0)//Эта проверка необходима для того, что бы не добавить лишнее "="
//к оператору присваивания или к оператору "не равно".
String->Insert(le2,"=");//Вставляем логический оператор "равно" на языке С++
OnCancel();//Закрываем диалоговое окно программы.
Чтобы протестировать корректную работу программы в случае появления внештатных ситуаций, попробуем для файла, в который будет производиться запись, поставить атрибут "Только чтение". При попытки трансляции исходного кода и записи его в файл появляется окно с сообщением об ошибке, изображенное на рисунке 6.
Рисунок 6 - Окно с сообщением об ошибке записи
Следующим этапом тестирования будет удаление файла, содержащего исходный код на языке Паскаль. При открытии приложения появится сообщение об ошибке чтения файла, изображенное на рисунке 7.
Рисунок 7 - Окно с сообщением об ошибке чтения
Следующим этапом тестирования будет проверка корректности трансляции исходного кода на Паскале в исходный код на С++.
На рисунке 8 изображен первый вариант транслируемой программы и результат трансляции.
Рисунок 8 - Трансляция первой тестовой программы
На рисунке 9 изображен второй вариант транслируемой программы и результат трансляции.
Рисунок 9 - Трансляция второй тестовой программы
3. D. Grune, C. H. ( 2008). C++ For Beginners. Chichester: Ellis Horwood
4. Б. Керниган, Д. Р. (2009). Си, Язык программирования. Вильямc.
Создание транслятора, обрабатывающего код программы на языке Паскаль и за счет эквивалентных операторов генерирующего программу на Си. Особенности внешней спецификации и работы лексического анализатора. Структура программы, вывод результатов на экран. курсовая работа [254,0 K], добавлен 02.07.2011
Выбор метода проектирования транслятора с языка Паскаль на язык Си, разработка и кодирование алгоритма программы. Использование допустимых операторов в исходном тексте, определение типов переменных и синтаксиса логических и арифметических выражений. курсовая работа [1,0 M], добавлен 03.07.2011
Создание приложения, исполняющего трансляцию программы из языка Паскаль в язык Си: разработка алгоритма реализации задачи, описание необходимых констант, переменных, функций и операторов, представление листинга программы и распечатка результатов. курсовая работа [305,9 K], добавлен 03.07.2011
Создание программы для перевода кодов с языка Pascal на язык Си. Обработка программ операторами case, assign, rewrite и write. Способы объявления файла, комментария, переменных, логических и арифметических выражений. Виды синтаксических анализаторов. курсовая работа [461,0 K], добавлен 03.07.2011
Программный комплекс для разработки программы транслирующей программу с языка Pascal на язык С++. Построение логической и арифметической модели решения. Разработка компилятора для программы. Методы отладки программы и создание для нее документации. курсовая работа [742,6 K], добавлен 03.07.2011
Составление транслятора на языке С для перевода кода программы из языка Pascal в код программы на языке Cи. Распознавание и перевод конструкций: for, type, function, integer. Вешняя спецификация, описание, структура, текст программы; распечатка текстов. курсовая работа [287,8 K], добавлен 24.06.2011
Написание транслятора посредством языка Си, обрабатывающего конструкции integer, if Le then, записи (record), а также реализующего обработку new для выделения динамической памяти: разработка алгоритма реализации задачи, представление листинга программы. курсовая работа [171,7 K], добавлен 03.07.2011
Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д. PPT, PPTX и PDF-файлы представлены только в архивах. Рекомендуем скачать работу .
© 2000 — 2021
Разработка транслятора на языке Си курсовая работа. Программирование, компьютеры и кибернетика.
Реферат по теме Суд. Судебная власть за рубежом
Доклад: Генетические манипуляции
Реферат: Застосування зарубіжного досвіду управління інноваційним потенціалом в Україні
Курсовая работа по теме Наименования лица в русских пословицах
Иван Лисаев Чире Паранма Суралман Сочинение
Дипломная работа по теме Управление продажами: технология эффективности продаж на примере ОАО 'Седьмой континент' г. Москвы
Реферат: Выпрямители
Групповая психотерапия
Курсовая работа по теме Монтаж металлических конструкций 2-5 этажей блока постоянного хранения гаража на 300 автомобилей
Методы Контрацепции Реферат
Диагностика Психического Развития Детей Дошкольного Возраста Реферат
Итоговая Годовая Контрольная Работа По Математике
Дипломная работа по теме Виды соучастий преступлений и пределы их ответственности
Биология 5 Класс Первая Контрольная Работа
Контрольная работа: Особенности общения детей со взрослыми
Реферат: Формування передумов естетичного інтересу у старших дошкільників у процесі музичної діяльності
Реферат: Система государственной власти и управления России в 1917-1922. Скачать бесплатно и без регистрации
Написать Эссе На Тему Чтение
Модернизация Колонного Синтеза Карбамида Диссертация
Роль рекламы в реализации страховых услуг
Диагностирование и лечение закрытого консолидирующегося чрезвертельного перелома левой бедренной кости - Медицина история болезни
Проблемы стадии возбуждения уголовного дела - Государство и право реферат
Психологічні і соціально-психологічні характеристики персоналу. Вирішення конфліктів в організації (на ТОВ "Горізонт ОПБ") - Менеджмент и трудовые отношения магистерская работа