Исходный код на языке
Паскаль
|
Исходный код на языке 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.
. Описание алгоритма
Семантика языков программирования изменяется в очень широких пределах.
Они отличаются не только по особенностям реализации отдельных операций, но и по
парадигмам программирования, определяющим принципиальные различия в методах
разработки программ. Специфика реализации операций может касаться как структуры
обрабатываемых данных, так и правил обработки одних и тех же типов данных.
Большинство языков работают в основном со скалярами, предоставляя для обработки
массивов процедуры и функции, написанные программистами. Но даже при выполнении
операции сложения двух целых чисел такие языки, как C++ и Паскаль могут вести
себя по-разному. Наряду с традиционным процедурным программированием,
называемым также императивным, существуют такие парадигмы как функциональное
программирование, логическое программирование и объектно-ориентированное
программирование. Структура понятий и объектов языков сильно зависит от
избранной парадигмы, что также влияет на реализацию транслятора. Даже один и
тот же язык может быть реализован нескольким способами. Это связано с тем, что
теория формальных грамматик допускает различные методы разбора одних и тех же
предложений. В соответствии с этим трансляторы разными способами могут получать
один и тот же результат (объектную программу) по первоначальному исходному
тексту. Вместе с тем, все языки программирования обладают рядом общих
характеристик и параметров. Эта общность определяет и схожие для всех языков
принципы организации трансляторов.
. Языки программирования предназначены для облегчения
программирования. Поэтому их операторы и структуры данных более мощные, чем в
машинных языках.
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. Функция возвращает порядковый номер первого символа
совпавшей комбинации.::CString::Delete(int k, const 1) - Удаляет колличество
символов, указонное во втором аргументе, начиная с k-го
символа.::CString::Insert(int k, CString str) - Вставляет подстроку str в
текущую строку начиная с символа k.::CString::GetLength() - Возвращает длину
текущей строки.
. Листинг программы
Заголовочный файл приложения 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
//Cp2cApp : public CWinApp
{:cApp();
// Overrides:BOOL InitInstance();
// Implementation_MESSAGE_MAP()
};
extern Cp2cApp theApp;
Заголовочный файл диалогового окна p2cDlg.h
/ p2cDlg.h : header file
//
#pragma once
// Cp2cDlg dialogCp2cDlg : public CDialog
{
// Construction:cDlg(CWnd* pParent = NULL);// standard
constructorCodeC[100];//Объявляем строковой массив из 100 элементов, для
хранения исходного кода на С++.* pCodeP;//Указатель на массив
CodeCCodeP[100];//Объявляем строковой массив из 100 элементов, для хранения
исходного кода на Паскале.* pCodeC;//Указатель на массив CodeP
// Dialog Data{ IDD = IDD_P2C_DIALOG };:void
DoDataExchange(CDataExchange* pDX);// DDX/DDV support
// Generated message map functionsBOOL OnInitDialog();_msg void
OnPaint();_msg HCURSOR OnQueryDragIcon();_MESSAGE_MAP():fRead(UINT nID,
CString* String);fWrite(UINT nID, CString* String);_msg void OnBnClickedButton1();fComment(CString*
String);fvar(CString* String);fMain(CString* String);fWhile(CString*
String);_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_MESSAGE_MAP(Cp2cApp, CWinApp)_COMMAND(ID_HELP,
&CWinApp::OnHelp)_MESSAGE_MAP()
// Cp2cApp constructioncApp::Cp2cApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
// The one and only Cp2cApp objectcApp theApp;
// Cp2cApp initializationCp2cApp::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
// in your application..dwICC = ICC_WIN95_CLASSES;(&InitCtrls);::InitInstance();();
// 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(_T("Local
AppWizard-Generated Applications"));cDlg dlg;_pMainWnd = &dlg;_PTR
nResponse = dlg.DoModal();
/*if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}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 dialogcDlg::Cp2cDlg(CWnd* pParent /*=NULL*/)
: CDialog(Cp2cDlg::IDD, pParent)
{=&CodeP[0];//Создаем указатели на нулевые строки
массивов.=&CodeC[0];(int i=0; i<100; i++)//Инициализируем элементы
строковых массивов пустыми значениями.
{[i]="";[i]="";
}_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}Cp2cDlg::DoDataExchange(CDataExchange* pDX)
{::DoDataExchange(pDX);
}_MESSAGE_MAP(Cp2cDlg, CDialog)_WM_PAINT()_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP_BN_CLICKED(IDC_BUTTON1,
&Cp2cDlg::OnBnClickedButton1)_BN_CLICKED(IDC_BUTTON2,
&Cp2cDlg::OnBnClickedButton2)_MESSAGE_MAP()
// Cp2cDlg message handlersCp2cDlg::OnInitDialog()
{::OnInitDialog();(IDC_EDIT1,pCodeP);//Первый аргумент -
элемент диалога,
//в который будет выводиться текст, второй - указатель на
массив строк.
// Set the icon for this dialog. The framework does this
automatically
// when the application's main window is not a dialog(m_hIcon,
TRUE);// Set big icon(m_hIcon, FALSE);// Set small icon
// TODO: Add extra initialization hereTRUE; // return TRUE
unless you set the focus to a control
}
// to draw the icon. For MFC applications using the
document/view model,
// this is automatically done for you by the
framework.Cp2cDlg::OnPaint()
{(IsIconic())
{dc(this); // device context for painting(WM_ICONERASEBKGND,
reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectanglecxIcon =
GetSystemMetrics(SM_CXICON);cyIcon =
GetSystemMetrics(SM_CYICON);rect;(&rect);x = (rect.Width() - cxIcon + 1) /
2;y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon.DrawIcon(x, y, m_hIcon);
}
{::OnPaint();
}
}
// The system calls this function to obtain the cursor to
display while the user drags
// the minimized window.Cp2cDlg::OnQueryDragIcon()
{static_cast<HCURSOR>(m_hIcon);
}Cp2cDlg::OnBnClickedButton1()//Обработчик нажатия на кнопку.
{ int i=0;//Объявляем и инициализируем
счетчик.(CodeP[i]!="")//Пока элемент массива не пустой
{[i]=CodeP[i];//Присваиваем строки*
pTemp=&CodeC[i];//Создаем временный указатель на текущую
строку.(pTemp);//Запускаем функции, передавая в кач-ве аргумента указатель на
текущую строку.(pTemp);(pTemp);(pTemp);++;
}(IDC_EDIT2,pCodeC);//Вызываем функцию вывода результата и
записи его в файл
}Cp2cDlg::fRead(UINT nID, CString* String)//Функция
производит чтение строк из файла.
//Она же построчно заносит содержимое файла в строковый
массив.
{szOut=""; //Создаем пустую строку, для вывода
результата.Inputfile; //Создаем объект для файла.FileExc; //Объект исключений
для файлаnOpenFlags; //Флаг открытияs; //Временная строка= CFile::modeRead;
//Если файл не открывается(!Inputfile.Open("CodePas.txt",
nOpenFlags, &FileExc))
{.ReportError();//Выводим стандартное сообщение об ошибке;
}
//Пока возможно чтение строки...i=0;(Inputfile.ReadString(s))
{[i]=s;//Присваиваем строку из файла элементу строкового
массива..Append(String[i]);//Добавляем текущую строку в строку
результата..AppendChar('\r');//Добавляем разрывы
строки.AppendChar('\n');//Добавляем разрывы строки++;
}.Close();//Закрываем текстовый файл.(nID,szOut);//Выводим
текст в элемент диалогового окна.
}Cp2cDlg::fWrite(UINT nID, CString* String)//Функция
производит запись результата в файл.
{szOut="";//Создаем пустую строку, для вывода
результата.Outputfile;//Создаем объект для файла.FileExc; //Объект исключений
для файлаnOpenFlags;//Флаг открытия= CFile::modeWrite |
CFile::modeCreate;//Создаем файл
//Если файл не
открывается(!Outputfile.Open("CodeC.txt", nOpenFlags, &FileExc))
{.ReportError();//Выводим стандартное сообщение об ошибке;
}i=0;(String[i]!="")//Пока строка не пуста
{.Append(String[i]);//Добавляем текущую строку в строку
результата..AppendChar('\r');//Добавляем разрывы
строки.AppendChar('\n');//Добавляем разрывы
строки.WriteString(String[i]+'\n');//Записываем строку в файл, добавляя \n в
конец.++;
}.Close();//Закрываем файл(nID,szOut);//Выводим текст в
элемент диалогового окна.
}Cp2cDlg::fComment(CString* String)//Функция для обработки
комментариев.
{ int nach=-1,kon=-1;//Переменные, в которых будет храниться
порядковый номер определенных комбинаций
символов.=String->Find("{");//Присваиваем переменной номер
искомого символа, если символ присутствует в строке,
//то значение будет больше нуля.(nach>=0)//Если символ
присутствует
{>Insert(nach,'/');//Вставляем необходимые
символы>Insert(nach+1,'*');>Delete(nach+2,1);//Удаляем скобки
комментариев на языке Паскаль.
}=String->Find("}");//Аналогичные действия,
только для закрывающихся скобок.(kon>=0)
{>Delete(kon,1);>Insert(kon,'*');>Insert(kon+1,'/');
}=-1,kon=-1;=String->Find("(*");//Выполняем
аналогичные действия с другим видом комментариев на Паскале.(nach>=0)
{>Delete(nach,2);>Insert(nach,'/');>Insert(nach+1,'*');
}=String->Find("*)");(kon>=0)
{>Insert(kon,'*');>Insert(kon+1,'/');>Delete(kon+2,2);
}
}Cp2cDlg::fvar(CString* String)//Функция обрабатывает
объявление переменных и массива целочисленного типа и оператора присваивания.
{rav=-1,inte=-1,arr=-1,var=-1;//Переменные, в которых будет
храниться порядковый номер определенных комбинаций
символов.=String->Find(":=");//Ищем оператор
присваивания=String->Find("var");//Ищем объявление
переменных(rav>=0)
{>Delete(rav,2);//Удаляем оператор присваивания
}(var>=0)
{>Delete(var,4);//Удаляем оператор объявления переменных
VAR.
}=String->Find("integer");//Ищем объявление
целочисленного типа(inte>=0)
{>Delete(inte,7);//Удаляем объявление целочисленного
типа>Delete(String->Find(":"));//Удаляем лишние символы>Insert(0,"int
");//Вставляем в начало строки объявление целочисленного типа для С++
}=String->Find("array");//Ищем объявление
массива(arr>=0)
{>Delete(arr,5);//Удаляем
array>Delete(String->Find("of"),2);//Удаляем лишние
символы>Delete(String->Find("..")-1,1);>Delete(String->Find(".."),2);
}
}Cp2cDlg::fMain(CString* String)//Функция ищет и заменяет
операторные скобки и объявляет функцию void main()
{prg=-1,beg=-1,end=-1,end1=-1; //Переменные, в которых будет
храниться порядковый номер определенных комбинаций
символов.=String->Find("program");//Производим поиск ключевых
слов=String->Find("begin");=String->Find("end;");=String->Find("end.");(prg>=0)
{>Delete(0,String->GetLength());//Очищаем
строку>Append("void main(void)");//Вставляем объявление ф-ции void
main()
}(beg>=0)
{>Delete(beg,5);//Удаляем операторные скобки на языке
Паскаль>Insert(beg,"{");//Вставляем операторные скобки на языке
С++
}(end>=0)
{>Delete(end,4);//Удаляем операторные скобки на языке
Паскаль>Insert(end,"}");//Вставляем операторные скобки на языке
С++
}(end1>=0)
{>Delete(end,4);//Удаляем операторные скобки на языке
Паскаль>Insert(end,"}");//Вставляем операторные скобки на языке
С++
}
}Cp2cDlg::fWhile(CString* String)//Функция обрабатывает цикл
while и логические операторы
{wh=-1,le1=-1,le2=-1;//Переменные, в которых будет храниться
порядковый номер определенных комбинаций
символов.=String->Find("while");//Производим поиск ключевых
слов(wh>=0)
{>Insert(6,"(");>Insert(String->Find("do")-1,")");>Delete(String->Find("do"),2);
}=String->Find("<>");//Производим поиск
логического оператора "не равно"(le1>=0)
{>Insert(String->Find("<>"),"!=");//Вставляем
логический оператор "не равно" на языке
С++>Delete(String->Find("<>"),2);//Удаляем логический
оператор "не равно" на языке Паскаль
}=String->Find("=");//Производим поиск
логического оператора "равно"(le2>=0 && le1<0)
//к оператору присваивания или к оператору "не
равно".
{>Insert(le2,"=");//Вставляем логический
оператор "равно" на языке С++
}
}
}Cp2cDlg::OnBnClickedButton2()
{();//Закрываем диалоговое окно программы.
}
. Описание тестовых прогонов
Чтобы протестировать корректную работу программы в случае появления
внештатных ситуаций, попробуем для файла, в который будет производиться запись,
поставить атрибут "Только чтение". При попытки трансляции исходного
кода и записи его в файл появляется окно с сообщением об ошибке, изображенное
на рисунке 6.
Рисунок 6 - Окно с сообщением об ошибке записи
Следующим этапом тестирования будет удаление файла, содержащего исходный
код на языке Паскаль. При открытии приложения появится сообщение об ошибке
чтения файла, изображенное на рисунке 7.
Рисунок 7 - Окно с сообщением об ошибке чтения
Следующим этапом тестирования будет проверка корректности трансляции
исходного кода на Паскале в исходный код на С++.
На рисунке 8 изображен первый вариант транслируемой программы и результат
трансляции.
Рисунок 8 - Трансляция первой тестовой программы
На рисунке 9 изображен второй вариант транслируемой программы и результат
трансляции.
Рисунок 9 - Трансляция второй тестовой программы
Заключение
В
ходе выполнения курсового проекта был написан несложный однопроходный
транслятор. Понятие трансляции относится не только к языкам программирования,
но и к другим компьютерным языкам <http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA>,
вроде языков разметки
<http://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%82%D0%BA%D0%B8>,
аналогичных HTML <http://ru.wikipedia.org/wiki/HTML>, и к естественным
языкам, вроде английского
<http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA>
или русского <http://ru.wikipedia.org/wiki/%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA>.
Основываясь на полученных в ходе выполнения курсовой работы знаниях, можно
лучше понять устройство и механизмы процессов в компиляторах и интерпретаторах.
Для реализации курсового проекта не случайно выбрана среда программирования Visual Studio 2008 и пакет библиотек MFC. С их
помощью удалось многократно уменьшить объем написанного программного кода, при
этом не потерям в функциональности и стабильности.
Список используемой литературы
1. Prentiss Knowlton
<http://www.qbd.com.au/search.htm?author=Prentiss+Knowlton> (2009).
Murach's C++ 2008. Вильямc.
. 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.
Похожие работы на - Разработка транслятора на языке Си