Помощь в написании студенческих работ
Антистрессовый сервис

Разработка транслятора на языке Си

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

На сегодняшний день, Windows является безусловно лидирующей операционной системой на рынке персональных компьютеров. Поэтому успех современного программиста напрямую зависит от его умения разрабатывать качественные и эффективные приложения Windows. Приложения постоянно усложняются и требуют все большего времени для их создания. Для облегчения программирования Windows-приложений фирмой Microsoft… Читать ещё >

Разработка транслятора на языке Си (реферат, курсовая, диплом, контрольная)

Министерство образования и науки Российской Федерации Государственное образовательное учреждение высшего профессионального образования «Северо-Кавказский Государственный Технический Университет»

Факультет информационных технологий и телекоммуникаций КУРСОВОЙ ПРОЕКТ по дисциплине «Программирование на языке высокого уровня»

Исполнитель:

Вержбо Д. С.

Группа АСОУ-091

Руководитель:

Братченко Н.Ю.

Ставрополь

  • Введение
    • 1. Теоретическая часть
      • 2. Постановка задачи
      • 3. Внешняя спецификация
      • 4. Описание алгоритма
      • 5. Структура программы и описание функций и операторов
      • 6. Листинг программы
      • 7. Описание тестовых прогонов
      • Заключение
      • Список используемой литературы
      • Введение
      • На сегодняшний день, Windows является безусловно лидирующей операционной системой на рынке персональных компьютеров. Поэтому успех современного программиста напрямую зависит от его умения разрабатывать качественные и эффективные приложения Windows. Приложения постоянно усложняются и требуют все большего времени для их создания. Для облегчения программирования Windows-приложений фирмой Microsoft была разработана библиотека MFC (Microsoft Foundation Classes — Базовые Классы Microsoft), которая впервые была представлена на рынке в 1992 г вместе с компилятором Microsoft C/C++ 7.0. Сейчас она представляет собой мощный набор классов C++, которые позволяют программировать приложения на достаточно высоком уровне абстракции, и вместе с тем открывают для опытных программистов легкий доступ к функциям более низкого уровня, что позволяет писать эффективные приложения и полностью использовать все возможности операционной системы.
      • 1. Теоретическая часть
      • Поскольку текст, записанный на языке программирования, непонятен компьютеру, то требуется перевести его на машинный код. Такой перевод программы с языка программирования на язык машинных кодов называется трансляцией, а выполняется она специальными программами — трансляторами.
      • Транслятор — обслуживающая программа, преобразующая исходную программу, предоставленную на входном языке программирования, в рабочую программу, представленную на объектном языке.
      • В настоящее время трансляторы разделяются на три основные группы: ассемблеры, компиляторы и интерпретаторы.
      • Ассемблер — системная обслуживающая программа, которая преобразует символические конструкции в команды машинного языка. Специфической чертой ассемблеров является то, что они осуществляют дословную трансляцию одной символической команды в одну машинную. Таким образом, язык ассемблера (еще называется автокодом) предназначен для облегчения восприятия системы команд компьютера и ускорения программирования в этой системе команд. Программисту гораздо легче запомнить мнемоническое обозначение машинных команд, чем их двоичный код.
      • Вместе с тем, язык ассемблера, кроме аналогов машинных команд, содержит множество дополнительных директив, облегчающих, в частности, управление ресурсами компьютера, написание повторяющихся фрагментов, построение многомодульных программ. Поэтому выразительность языка намного богаче, чем просто языка символического кодирования, что значительно повышает эффективность программирования.
      • Компилятор — это обслуживающая программа, выполняющая трансляцию на машинный язык программы, записанной на исходном языке программирования. Также как и ассемблер, компилятор обеспечивает преобразование программы с одного языка на другой (чаще всего, в язык конкретного компьютера). Вместе с тем, команды исходного языка значительно отличаются по организации и мощности от команд машинного языка. Существуют языки, в которых одна команда исходного языка транслируется в 7−10 машинных команд. Однако есть и такие языки, в которых каждой команде может соответствовать 100 и более машинных команд. Кроме того, в исходных языках достаточно часто используется строгая типизация данных, осуществляемая через их предварительное описание. Программирование может опираться не на кодирование алгоритма, а на тщательное обдумывание структур данных или классов. Процесс трансляции с таких языков обычно называется компиляцией, а исходные языки обычно относятся к языкам программирования высокого уровня (или высокоуровневым языкам). Абстрагирование языка программирования от системы команд компьютера привело к независимому созданию самых разнообразных языков, ориентированных на решение конкретных задач. Появились языки для научных расчетов, экономических расчетов, доступа к базам данных и другие.
      • Интерпретатор — программа или устройство, осуществляющее пооператорную трансляцию и выполнение исходной программы. В отличие от компилятора, интерпретатор не порождает на выходе программу на машинном языке. Распознав команду исходного языка, он тут же выполняет ее. Как в компиляторах, так и в интерпретаторах используются одинаковые методы анализа исходного текста программы. Но интерпретатор позволяет начать обработку данных после написания даже одной команды. Это делает процесс разработки и отладки программ более гибким. Кроме того, отсутствие выходного машинного кода позволяет не «захламлять» внешние устройства дополнительными файлами, а сам интерпретатор можно достаточно легко адаптировать к любым машинным архитектурам, разработав его только один раз на широко распространенном языке программирования. Поэтому, интерпретируемые языки, типа Java Script, VB Script, получили широкое распространение. Недостатком интерпретаторов является низкая скорость выполнения программ. Обычно интерпретируемые программы выполняются в 50−100 раз медленнее программ, написанных в машинных кодах.
      • Синтаксис — совокупность правил некоторого языка, определяющих формирование его элементов. Иначе говоря, это совокупность правил образования семантически значимых последовательностей символов в данном языке. Синтаксис задается с помощью правил, которые описывают понятия некоторого языка. Примерами понятий являются: переменная, выражение, оператор, процедура. Последовательность понятий и их допустимое использование в правилах определяет синтаксически правильные структуры, образующие программы. Именно иерархия объектов, а не то, как они взаимодействуют между собой, определяются через синтаксис. Например, оператор может встречаться только в процедуре, а выражение в операторе, переменная может состоять из имени и необязательных индексов и т. д. Синтаксис не связан с такими явлениями в программе как «переход на несуществующую метку» или «переменная с данным именем не определена». Этим занимается семантика.
      • Семантика — правила и условия, определяющие соотношения между элементами языка и их смысловыми значениями, а также интерпретацию содержательного значения синтаксических конструкций языка. Объекты языка программирования не только размещаются в тексте в соответствии с некоторой иерархией, но и дополнительно связаны между собой посредством других понятий, образующих разнообразные ассоциации. Например, переменная, для которой синтаксис определяет допустимое местоположение только в описаниях и некоторых операторах, обладает определенным типом, может использоваться с ограниченным множеством операций, имеет адрес, размер и должна быть описана до того, как будет использоваться в программе.
      • Синтаксический анализатор — компонента компилятора, осуществляющая проверку исходных операторов на соответствие синтаксическим правилам и семантике данного языка программирования. Несмотря на название, анализатор занимается проверкой и синтаксиса, и семантики. Он состоит из нескольких блоков, каждый из которых решает свои задачи. Более подробно будет рассмотрен при описании структуры транслятора.
      • Любой транслятор выполняет следующие основные задачи:
      • — анализирует транслируемую программу, в частности определяет, содержит ли она синтаксические ошибки;
      • — генерирует выходную программу (ее часто называют объектной) на языке машинных команд;
      • — распределяет память для объектной программы.
      • 2. Постановка задачи
      • компилятор трансляция программный язык
      • В данном курсовом проекте требуется написать транслятор на языке С++, который будет выполнять перевод программный код на языке Паскаль в программный код на языке С++.
      • По условию задания, требуется, чтобы транслятор переводил следующие операторы:
      • — integer
      • — while le1 do
      • — assign, reset, read
      • — файлы
      • А так же обрабатывал арифметическое (см. рисунок 1) и логическое выражение (см. рисунок 2).
      • Рисунок 1 — Арифметическое выражение ae1
      • Рисунок 2 — Логическое выражение le1
      • Программа должна так же обрабатывать комментарии и операции присваивания, а при встрече незнакомых конструкций выдавать сообщение об ошибке. Между лексемами может быть любое количество пробелов или знаков табуляции, переводов строк и т. д. Программа должна реагировать только на верные или ошибочные конструкции. При формировании можно не учитывать правила отступа, но для реализации более удобочитаемых программ этот пункт желателен.
      • Программа будет предоставлять пользователю выбрать входной файл и путь по которому будет записан выходной файл. При этом должна быть предусмотрена обработка ошибок ввода и запрос о повторном вводе пути файла. Для того чтобы упростить понимание поставленной задачи, составим таблицу эквивалентных конструкций.

Таблица1 — Таблица эквивалентных конструкций

Конструкция на Паскале

Эквивалентная конструкция на Си

Операторные скобки begin… end

{…}

Оператор var

var «name»: «type»; «name», «name»: «type» ;

" name": array[1.n] of «type» ;

" type" «name», «name»; «type» «name» ;

" type" «name» [n];

Тип переменной

" name": integer;

int «name» ;

Оператор while «le1» do;

while («le1»);

{ комментарий 1 } (*комментарий 2*)

/*комментарий 1*/ /*комментарий 2*/

Ниже приведен пример работы транслятора с языка программирования Пскаль на язык С++.

Исходный код на языке Паскаль

Исходный код на языке C++

program Test;

var a, b: integer;

Arr: array[1.10] of integer;

begin

a:=0;

{Oneline comment}

read (a);

while a<>10 do

begin

a:=a+1;

read (Arr[a]);

end;

b:=a*10;

(*Multi

line

comment*)

write (a);

end.

void main (void)

int a, b;

int Arr [10];

{

a=0;

/*Oneline comment*/

read (a);

while (a≠10)

{

a=a+1;

read (Arr[a]);

}

b=a*10;

/*Multi

line

comment*/

write (a);

}

3. Внешняя спецификация Программа представляет собой исполняющий файл p2c.exe. При запуске программы открывается окно, изображенное на рисунке 3.

Рисунок 3 — Интерфейс программы Для работы программы необходимо, что бы в папке с исполняющим файлом находился текстовый документ с именем «CodePas.txt», содержащий исходный код на языке программирования Паскаль.

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

Рисунок 4 — Сообщение об ошибке В окне программы расположены два элемента «Edit Box», в которые выводится исходный и преобразованный код. Эти элементы защищены от редактирования пользователем, т.к. по условию курсового проекта исходный код должен читаться из файла и преобразованный код тоже выгружаться в файл.

Также, в окне программы расположены две кнопки «Translate» и «Close». При нажатии на кнопку «Translate» запускается серия подпрограмм, которые осуществляют трансляцию исходного кода. При нажатии на кнопку «Close» окно программы закрывается.

Аппаратные и системные требования для запуска программы: ОС Windows XP, Windows Vista и 7. Процессор не менее 1 ГГц, ОЗУ 256Мб и более. Также необходима установка библиотеки компонентов Microsoft Net. Framework 2.0.

4. Описание алгоритма Семантика языков программирования изменяется в очень широких пределах. Они отличаются не только по особенностям реализации отдельных операций, но и по парадигмам программирования, определяющим принципиальные различия в методах разработки программ. Специфика реализации операций может касаться как структуры обрабатываемых данных, так и правил обработки одних и тех же типов данных. Большинство языков работают в основном со скалярами, предоставляя для обработки массивов процедуры и функции, написанные программистами. Но даже при выполнении операции сложения двух целых чисел такие языки, как C++ и Паскаль могут вести себя по-разному. Наряду с традиционным процедурным программированием, называемым также императивным, существуют такие парадигмы как функциональное программирование, логическое программирование и объектно-ориентированное программирование. Структура понятий и объектов языков сильно зависит от избранной парадигмы, что также влияет на реализацию транслятора. Даже один и тот же язык может быть реализован нескольким способами. Это связано с тем, что теория формальных грамматик допускает различные методы разбора одних и тех же предложений. В соответствии с этим трансляторы разными способами могут получать один и тот же результат (объектную программу) по первоначальному исходному тексту. Вместе с тем, все языки программирования обладают рядом общих характеристик и параметров. Эта общность определяет и схожие для всех языков принципы организации трансляторов.

1. Языки программирования предназначены для облегчения программирования. Поэтому их операторы и структуры данных более мощные, чем в машинных языках.

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

3. Для любого языка определяется:

— Множество символов, которые можно использовать для записи правильных программ (алфавит), основные элементы.

— Множество правильных программ (синтаксис).

— «Смысл» каждой правильной программы (семантика).

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

При запуске программы исходный текстовый файл считывается построчно и записывается в массив с именем 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 () — Возвращает длину текущей строки.

6. Листинг программы Заголовочный файл приложения p2c. h

// p2c. h: main header file for the PROJECT_NAME application

#pragma once

#ifndef __AFXWIN_H__

#error «include 'stdafx.h' before including this file for PCH»

#endif

#include «resource.h» // main symbols

// Cp2cApp:

// See p2c. cpp for the implementation of this class

class Cp2cApp: public CWinApp

{

public:

Cp2cApp ();

// Overrides

public:

virtual BOOL InitInstance ();

// Implementation

DECLARE_MESSAGE_MAP ()

};

extern Cp2cApp theApp;

Заголовочный файл диалогового окна p2cDlg. h

/ p2cDlg. h: header file

#pragma once

// Cp2cDlg dialog

class Cp2cDlg: public CDialog

{

// Construction

public:

Cp2cDlg (CWnd* pParent = NULL);// standard constructor

CString CodeC[100]; //Объявляем строковой массив из 100 элементов, для хранения исходного кода на С++.

CString* pCodeP;//Указатель на массив CodeC

CString CodeP[100]; //Объявляем строковой массив из 100 элементов, для хранения исходного кода на Паскале.

CString* pCodeC;//Указатель на массив CodeP

// Dialog Data

enum { IDD = IDD_P2C_DIALOG };

protected:

virtual void DoDataExchange (CDataExchange* pDX);// DDX/DDV support

// Implementation

protected:

HICON m_hIcon;

// Generated message map functions

virtual BOOL OnInitDialog ();

afx_msg void OnPaint ();

afx_msg HCURSOR OnQueryDragIcon ();

DECLARE_MESSAGE_MAP ()

public:

void fRead (UINT nID, CString* String);

void fWrite (UINT nID, CString* String);

afx_msg void OnBnClickedButton1();

void fComment (CString* String);

void fvar (CString* String);

void fMain (CString* String);

void fWhile (CString* String);

afx_msg void OnBnClickedButton2();

};

Исполняющий файл приложения p2c. cpp

// p2c. cpp: Defines the class behaviors for the application.

#include «stdafx.h»

#include «p2c.h»

#include «p2cDlg.h»

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// Cp2cApp

BEGIN_MESSAGE_MAP (Cp2cApp, CWinApp)

ON_COMMAND (ID_HELP, &CWinApp:OnHelp)

END_MESSAGE_MAP ()

// Cp2cApp construction

Cp2cApp:Cp2cApp ()

{

// TODO: add construction code here,

// Place all significant initialization in InitInstance

}

// The one and only Cp2cApp object

Cp2cApp theApp;

// Cp2cApp initialization

BOOL Cp2cApp: 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.

INITCOMMONCONTROLSEX InitCtrls;

InitCtrls.dwSize = sizeof (InitCtrls);

// Set this to include all the common control classes you want to use

// in your application.

InitCtrls.dwICC = ICC_WIN95_CLASSES;

InitCommonControlsEx (&InitCtrls);

CWinApp:InitInstance ();

AfxEnableControlContainer ();

// Standard initialization

// 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»));

Cp2cDlg dlg;

m_pMainWnd = &dlg;

INT_PTR nResponse = dlg. DoModal ();

/*if (nResponse == IDOK)

{

// TODO: Place code here to handle when the dialog is

// dismissed with OK

}

else if (nResponse == IDCANCEL)

{

// TODO: Place code here to handle when the dialog is

// dismissed with Cancel

}

// Since the dialog has been closed, return FALSE so that we exit the

// application, rather than start the application’s message pump.

*/return FALSE;

}

Исполняющий файл диалогового окна p2cDlg. cpp

// p2cDlg. cpp: implementation file

#include «stdafx.h»

#include «p2c.h»

#include «p2cDlg.h»

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// Cp2cDlg dialog

Cp2cDlg:Cp2cDlg (CWnd* pParent /*=NULL*/)

: CDialog (Cp2cDlg:IDD, pParent)

{

pCodeP=&CodeP[0]; //Создаем указатели на нулевые строки массивов.

pCodeC=&CodeC[0];

for (int i=0; i<100; i++)//Инициализируем элементы строковых массивов пустыми значениями.

{

CodeC[i]="" ;

CodeP[i]="" ;

}

m_hIcon = AfxGetApp ()->LoadIcon (IDR_MAINFRAME);

}

void Cp2cDlg: DoDataExchange (CDataExchange* pDX)

{

CDialog:DoDataExchange (pDX);

}

BEGIN_MESSAGE_MAP (Cp2cDlg, CDialog)

ON_WM_PAINT ()

ON_WM_QUERYDRAGICON ()

//}}AFX_MSG_MAP

ON_BN_CLICKED (IDC_BUTTON1, &Cp2cDlg:OnBnClickedButton1)

ON_BN_CLICKED (IDC_BUTTON2, &Cp2cDlg:OnBnClickedButton2)

END_MESSAGE_MAP ()

// Cp2cDlg message handlers

BOOL Cp2cDlg: OnInitDialog ()

{

CDialog:OnInitDialog ();

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.

void Cp2cDlg: OnPaint ()

{

if (IsIconic ())

{

CPaintDC dc (this); // device context for painting

SendMessage (WM_ICONERASEBKGND, reinterpret_cast (dc.GetSafeHdc ()), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics (SM_CXICON);

int cyIcon = GetSystemMetrics (SM_CYICON);

CRect rect;

GetClientRect (&rect);

int x = (rect.Width () — cxIcon + 1) / 2;

int y = (rect.Height () — cyIcon + 1) / 2;

// Draw the icon

dc.DrawIcon (x, y, m_hIcon);

}

else

{

CDialog:OnPaint ();

}

}

// The system calls this function to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR Cp2cDlg: OnQueryDragIcon ()

{

return static_cast (m_hIcon);

}

void Cp2cDlg: OnBnClickedButton1()//Обработчик нажатия на кнопку.

{ int i=0;//Объявляем и инициализируем счетчик.

while (CodeP[i]≠"")//Пока элемент массива не пустой

{

CodeC[i]=CodeP[i]; //Присваиваем строки

CString* pTemp=&CodeC[i]; //Создаем временный указатель на текущую строку.

fComment (pTemp);//Запускаем функции, передавая в кач-ве аргумента указатель на текущую строку.

fWhile (pTemp);

fvar (pTemp);

fMain (pTemp);

i++;

}

fWrite (IDC_EDIT2,pCodeC);//Вызываем функцию вывода результата и записи его в файл

}

void Cp2cDlg: fRead (UINT nID, CString* String)//Функция производит чтение строк из файла.

//Она же построчно заносит содержимое файла в строковый массив.

{

CString szOut=""; //Создаем пустую строку, для вывода результата.

CStdioFile Inputfile; //Создаем объект для файла.

CFileException FileExc; //Объект исключений для файла

UINT nOpenFlags; //Флаг открытия

CString s; //Временная строка

nOpenFlags = CFile: modeRead;

//Если файл не открывается

if (!Inputfile.Open («CodePas.txt», nOpenFlags, &FileExc))

{

FileExc.ReportError ();//Выводим стандартное сообщение об ошибке

return;

}

//Пока возможно чтение строки…

int i=0;

while (Inputfile.ReadString (s))

{

String[i]=s;//Присваиваем строку из файла элементу строкового массива.

szOut.Append (String[i]);//Добавляем текущую строку в строку результата.

szOut.AppendChar ('r');//Добавляем разрывы строки

szOut.AppendChar ('n');//Добавляем разрывы строки

i++;

}

Inputfile.Close ();//Закрываем текстовый файл.

SetDlgItemText (nID, szOut);//Выводим текст в элемент диалогового окна.

}

void Cp2cDlg: fWrite (UINT nID, CString* String)//Функция производит запись результата в файл.

{

CString szOut="" ;//Создаем пустую строку, для вывода результата.

CStdioFile Outputfile;//Создаем объект для файла.

CFileException FileExc; //Объект исключений для файла

UINT nOpenFlags;//Флаг открытия

nOpenFlags = CFile: modeWrite | CFile: modeCreate;//Создаем файл

//Если файл не открывается

if (!Outputfile.Open («CodeC.txt», nOpenFlags, &FileExc))

{

FileExc.ReportError ();//Выводим стандартное сообщение об ошибке

return;

}

int i=0;

while (String[i]≠"")//Пока строка не пуста

{

szOut.Append (String[i]);//Добавляем текущую строку в строку результата.

szOut.AppendChar ('r');//Добавляем разрывы строки

szOut.AppendChar ('n');//Добавляем разрывы строки

Outputfile.WriteString (String[i]+'n');//Записываем строку в файл, добавляя n в конец.

i++;

}

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->Insert (nach+1,'*');

String->Delete (nach+2,1);//Удаляем скобки комментариев на языке Паскаль.

}

kon=String->Find («}»);//Аналогичные действия, только для закрывающихся скобок.

if (kon>=0)

{

String->Delete (kon, 1);

String->Insert (kon,'*');

String->Insert (kon+1,'/');

}

nach=-1,kon=-1;

nach=String->Find («(*»);//Выполняем аналогичные действия с другим видом комментариев на Паскале.

if (nach>=0)

{

String->Delete (nach, 2);

String->Insert (nach,'/');

String->Insert (nach+1,'*');

}

kon=String->Find («*)»);

if (kon>=0)

{

String->Insert (kon,'*');

String->Insert (kon+1,'/');

String->Delete (kon+2,2);

}

}

void Cp2cDlg: fvar (CString* String)//Функция обрабатывает объявление переменных и массива целочисленного типа и оператора присваивания.

{

int rav=-1,inte=-1,arr=-1,var=-1;//Переменные, в которых будет храниться порядковый номер определенных комбинаций символов.

rav=String->Find («:=»);//Ищем оператор присваивания

var=String->Find («var»);//Ищем объявление переменных

if (rav>=0)

{

String->Delete (rav, 2);//Удаляем оператор присваивания

}

if (var>=0)

{

String->Delete (var, 4);//Удаляем оператор объявления переменных VAR.

}

inte=String->Find («integer»);//Ищем объявление целочисленного типа

if (inte>=0)

{

String->Delete (inte, 7);//Удаляем объявление целочисленного типа

String->Delete (String->Find («:»));//Удаляем лишние символы

String->Insert (0," int «);//Вставляем в начало строки объявление целочисленного типа для С++

}

arr=String->Find («array»);//Ищем объявление массива

if (arr>=0)

{

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»);//Производим поиск ключевых слов

beg=String->Find («begin»);

end=String->Find («end;»);

end1=String->Find («end.»);

if (prg>=0)

{

String->Delete (0,String->GetLength ());//Очищаем строку

String->Append («void main (void)»);//Вставляем объявление ф-ции void main ()

}

if (beg>=0)

{

String->Delete (beg, 5);//Удаляем операторные скобки на языке Паскаль

String->Insert (beg," {");//Вставляем операторные скобки на языке С++

}

if (end>=0)

{

String->Delete (end, 4);//Удаляем операторные скобки на языке Паскаль

String->Insert (end," }");//Вставляем операторные скобки на языке С++

}

if (end1>=0)

{

String->Delete (end, 4);//Удаляем операторные скобки на языке Паскаль

String->Insert (end," }");//Вставляем операторные скобки на языке С++

}

}

void Cp2cDlg: fWhile (CString* String)//Функция обрабатывает цикл while и логические операторы

{

int wh=-1,le1=-1,le2=-1;//Переменные, в которых будет храниться порядковый номер определенных комбинаций символов.

wh=String->Find («while»);//Производим поиск ключевых слов

if (wh>=0)

{

String->Insert (6," («);

String->Insert (String->Find («do»)-1,")");

String->Delete (String->Find («do»), 2);

}

le1=String->Find («<>»);//Производим поиск логического оператора «не равно»

if (le1>=0)

{

String->Insert (String->Find («<>»)," ≠");//Вставляем логический оператор «не равно» на языке С++

String->Delete (String->Find («<>»), 2);//Удаляем логический оператор «не равно» на языке Паскаль

}

le2=String->Find («=»);//Производим поиск логического оператора «равно»

if (le2>=0 && le1<0)

{

if (String->Find («:»)<0 || String->Find («!»)<0)//Эта проверка необходима для того, что бы не добавить лишнее «=»

//к оператору присваивания или к оператору «не равно» .

{

String->Insert (le2," =");//Вставляем логический оператор «равно» на языке С++

}

}

}

void Cp2cDlg: OnBnClickedButton2()

{

OnCancel ();//Закрываем диалоговое окно программы.

}

7. Описание тестовых прогонов Чтобы протестировать корректную работу программы в случае появления внештатных ситуаций, попробуем для файла, в который будет производиться запись, поставить атрибут «Только чтение». При попытки трансляции исходного кода и записи его в файл появляется окно с сообщением об ошибке, изображенное на рисунке 6.

Рисунок 6 — Окно с сообщением об ошибке записи Следующим этапом тестирования будет удаление файла, содержащего исходный код на языке Паскаль. При открытии приложения появится сообщение об ошибке чтения файла, изображенное на рисунке 7.

Рисунок 7 — Окно с сообщением об ошибке чтения Следующим этапом тестирования будет проверка корректности трансляции исходного кода на Паскале в исходный код на С++.

На рисунке 8 изображен первый вариант транслируемой программы и результат трансляции.

Рисунок 8 — Трансляция первой тестовой программы На рисунке 9 изображен второй вариант транслируемой программы и результат трансляции.

Рисунок 9 — Трансляция второй тестовой программы

Заключение

В ходе выполнения курсового проекта был написан несложный однопроходный транслятор. Понятие трансляции относится не только к языкам программирования, но и к другим компьютерным языкам, вроде языков разметки, аналогичных HTML, и к естественным языкам, вроде английского или русского. Основываясь на полученных в ходе выполнения курсовой работы знаниях, можно лучше понять устройство и механизмы процессов в компиляторах и интерпретаторах. Для реализации курсового проекта не случайно выбрана среда программирования Visual Studio 2008 и пакет библиотек MFC. С их помощью удалось многократно уменьшить объем написанного программного кода, при этом не потерям в функциональности и стабильности.

Список используемой литературы

1. Prentiss Knowlton (2009). Murach’s C++ 2008. Вильямc.

2. B. M. Harwani (2004). Thinking in C++ 2nd Edition. Вильямc.

3. D. Grune, C. H. (2008). C++ For Beginners. Chichester: Ellis Horwood

4. Б. Керниган, Д. Р. (2009). Си, Язык программирования. Вильямc.

Показать весь текст
Заполнить форму текущей работой