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

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

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

Выдержка из работы

Министерство образования и науки Российской Федерации

Государственное образовательное учреждение высшего профессионального образования

«Северокавказский государственный университет»

КУРСОВОЙ ПРОЕКТ

по дисциплине «Программирование на языке высокого уровня»

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

Вариант 6

Исполнитель: Даниелян Д. А.

Руководитель: Братченко Н. Ю.

Ставрополь, 2011

Оглавление

1. Задание на курсовой проект

2. Постановка задачи

2. 1 Название задачи

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

2. 3 Модель для решения

2. Арифметическая модель решения

2. 4 Входная информация

2. 5 Выходная информация

2. 6 Ошибки

3. Метод решения задачи

4. Структура программы

5. Листинг программы

6. Распечатка тестов и результатов

Выводы

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

1. Задание на курсовой проект

Цель: создать работу, в которой будет осуществлена программа транслятора Pascal — C, отладку для него и документацию.

Начало работы будет осуществляться разработкой ТЗ (технического задания); ее окончание — будет составлением отсчета о проделанной работе с описанием задания, кода и тестирования.

Решение поставленной задачи основанной на курсовом проекте, позволяет закрепить знания по дисциплине «Программирование на языке высокого уровня».

Тема для данной курсовой работы: «Разработка конвертора на языке С++ для перевода программ на языке Паскаль в текст программы на языке С++».

Заданная задача включает в себя создание конвектора на языке С++, переводящая программу с определенными операторами, написанную на языке Pascal, в программу на языке С++.

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

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

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

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

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

В ключевых словах операторов в программе на языке С++ использованы только строчные буквы, а в программе на языке Pascal — любые.

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

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

При формировании текста на С ++ возможно не учитывать правило отступа. Pascal разработка транслирующий

2. Постановка задачи

2.1 Название задачи

Задача — написание программы транслирующей программу с языка Pascal на зык С++. При этом используется урезанный вариант языка Pascal.

Операторы:

2.2 Программный комплекс для разработки

Для разработки возможно использовать ряд IDE, таких как: Eclipse, NetBeans, Borland C++, C++ builder, Visual studio и т. д.

При разработке транслятора будем использовать Microsoft Visual Studio 2010.

2.3 Модель для решения

Логическая модель решения:

2. Арифметическая модель решения

2.4 Входная информация

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

Если в написании имени или пути к файлу допущена ошибка или сам файл некорректен — выдается сообщение об ошибке и программа завершает работу.

2.5 Выходная информация

При обработке файла С++ в файл текстового документа вписывается новый код программы. Так же при подсчете общего количества операторов в файле Pascal, переведенных операторов и ошибочных — все сведения выводятся на экран. А так же адрес файла, где был сохранен транслируемый файл C++:

printf («nКоличество операторов в исходном файле: %d», kolobop1);

printf («nКоличество операторов в полученном файле: %d», kolobop2);

printf («nКоличество ошибочных операторов которые не были обработаны: %d», kolobop3);

printf («nnРезультат хранится в файле: %s», s);

2.6 Ошибки

При использовании этой программы пользователем могут быть допущены ошибки. К ним относятся:

1. Ввод неправильного пути (имени) файла Pascal

2. Ввод неправильного пути (имени) файла С++ (записи);

3. Некорректный файл Pascal.

В этих случаях работа конвектора прекращается.

3. Метод решения задачи

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

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

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

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

Далее приведены некоторые важные применения технологии трансляции.

Методы компиляции могут использоваться для трансляции бинарного кода для одной машины в код для другой, обеспечивая выполнение машиной программы, изначально скомпилированной для другого набора машинных команд. Методы бинарной трансляции использовались различными компьютерными компаниями для повышения доступности программного обеспечения для их машин. В частности, доминирование рынка персональных компьютеров с процессорами х86 привело к тому, что большая часть программного обеспечения оказалась доступна в виде кода для х86. Были разработаны бинарные трансляторы для конвертации кода х86 в коды Alpha и Sparc. Бинарная трансляция использовалась также фирмой Transmeta, Inc. в реализации набора команд х86. Процессор Transmeta Crusoe представлял собой LVIW-процессор, который вместо выполнения сложных команд х86 непосредственно аппаратным обеспечением использовал трансляцию для конвертации кода х86 в код LVIW.

Бинарная трансляция может также использоваться для обеспечения обратной совместимости. Когда процессоры в Apple Macintosh в 1994 году были сменены с Motorola MC 68 040 на PowerPC, то для того, чтобы процессоры PowerPC могли выполнять старый код МС 68 040, использовалась бинарная трансляция.

Ниже приведем систему обработки языка:

Рисунок 3.1 — Система обработки языка

Обобщенная структура компилятора и основные фазы компиляции показаны на рис. 3. 1

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

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

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

Основная задача синтаксического анализа — разбор структуры программы. Как правило, под структурой понимается дерево, соответствующее разбору в контекстно-свободной грамматике языка. В настоящее время чаще всего используется либо LL (1)-анализ (и его вариант — рекурсивный спуск), либо LL (1)-анализ и его варианты (LR (O), SLR (l), LALR (l) и другие). Рекурсивный спуск чаще используется при ручном программировании синтаксического анализатора, LR (1) — при использовании систем автоматического построения синтаксических анализаторов.

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

На этапе контекстного анализа выявляются зависимости между частями программы, которые не могут быть описаны контекстно-свободным синтаксисом. Это в основном связи «описание-использование», в частности, анализ типов объектов, анализ областей видимости, соответствие параметров, метки и другие. В процессе контекстного анализа таблицы объектов пополняются информацией об описаниях (свойствах) объектов.

Основным формализмом, использующимся при контекстном анализе, является аппарат атрибутных грамматик. Результатом контекстного анализа является атрибутированное дерево программы. Информация об объектах может быть как рассредоточена в самом дереве, так и сосредоточена в отдельных таблицах объектов. В процессе контекстного анализа также могут быть обнаружены ошибки, связанные с неправильным использованием объектов.

Затем программа может быть переведена во внутреннее представление. Это делается для целей оптимизации и/или удобства генерации кода. Еще одной целью преобразования программы во внутреннее представление является желание иметь переносимый компилятор. Тогда только последняя фаза (генерация кода) является машинно-зависимой. В качестве внутреннего представления может использоваться префиксная или постфиксная запись, ориентированный граф, тройки, четверки и другие.

4. Структура программы

Main — Основная программа

persvob — освобождение переменных

PutFail — считывание с исходного текста

GetFail -ввод в выходной текст

PerevodOperatorov — основная программа транслирования

Fbegin -проверка начала программы

IsKmentent -проверка наличия комментариев

Ochiblis-проверка на ошибочность оператора

poluchitSlovo — одна из основных программ, проверяет слово/символ

Ispolzotatty- работа с типами

sozdatvartype — добавление нового типа

Fvar -проверка наличия оператора var

Fread/freadln — проверка операторов read/readln

Logvurag — проверка на логическое выражение

Arifvurag/fArifvurag — проверка на арифметическое выражение

Fgoto — наличие оператора goto

Flabel — наличие оператора label

5. Листинг программы

// курсовая 6. cpp: определяет точку входа для консольного приложения.

//

#include «stdafx. h»

#include < conio. h>

#include < stdio. h>

#include < string. h>

#include < locale. h>

FILE *file1, *file2;

const int buferobmena = 10 000;

const int klchh = 12;

char * kluchslovos[klchh] =

{

«begin», «end», «var», «real», «false»,

«true», «read», «readln»,

«and», «or», «label», «goto» };

#define kluchslovo_begin 1

#define kluchslovo_end 2

#define kluchslovo_var 3

#define kluchslovo_real 4

#define kluchslovo_false 5

#define kluchslovo_true 6

#define kluchslovo_read 7

#define kluchslovo_readln 8

#define kluchslovo_and 9

#define kluchslovo_or 10

#define kluchslovo_label 11

#define kluchslovo_goto 12

#define t_Real 1

#define t_Bool 2

#define t_Label 3

const int cusernachalo = 6;

int unachalo;

#define klch_error 0

#define klch_space 1

#define klch_str 2

#define klch_numb 3

#define klch_char 4

char vuvodstroki[buferobmena],

vuvodstrokivfail[buferobmena];

int vvodimayast, vuvodimayast, chitarifvuragmoe;

int kolobop1, kolobop2,kolobop3;

int peremenst;

int perementype;

int peremennumf;

int dt;

typedef struct var{

char s[64];

int tp;

var * dalee;

};

typedef struct types{

char s[64];

int tid;

types * dalee;

};

var *nachalo, *lnachalo;

types * listtipov;

int logvurag ();

int farifvurag ();

int asign ();

int dobyachalovar (int gl){

var *np, *p;

if (gl) p = nachalo; else p = lnachalo;

while (p) {

if (strlen (p-> s)==peremenst&&

!memcmp (p-> s,&vuvodstroki[chitarifvuragmoe], peremenst)) return 0;

p = p-> dalee;

}

np = new var;

memcpy (np-> s,&vuvodstroki[chitarifvuragmoe], peremenst);

np-> s[peremenst]=0;

np-> tp = -1;

if (gl) {

np-> dalee = nachalo;

nachalo = np;

} else {

np-> dalee = lnachalo;

lnachalo = np;

}

return 1;

}

int dobtypeper ()

{

types *head=listtipov, *ntype;

while (head) {

if (strlen (head-> s)==peremenst&&

!memcmp (head-> s,&vuvodstroki[chitarifvuragmoe], peremenst)) return 0;

head = head-> dalee;

}

ntype = new types;

memcpy (ntype-> s,&vuvodstroki[chitarifvuragmoe], peremenst);

ntype-> s[peremenst]=0;

ntype-> tid = unachalo;

unachalo++;

ntype-> dalee = listtipov;

listtipov = ntype;

return 1;

}

int varut ()

{

types *head=listtipov;

while (head)

{

if (strlen (head-> s)==peremenst&&

!memcmp (head-> s,&vuvodstroki[chitarifvuragmoe], peremenst)) return head-> tid;

head = head-> dalee;

}

return 0;

}

char* utimya (int number)

{

types *head=listtipov;

while (head)

{

if (head-> tid==number) return head-> s;

head = head-> dalee;

}

return 0;

}

void sozdatnovtype (int gl, int type){

var *p;

if (gl) p = nachalo; else p = lnachalo;

while (p) {

if (p-> tp==-1) p-> tp = type;

p = p-> dalee;

}

}

int sozdatvartype (){

var * p;

p = lnachalo;

while (p) {

if (strlen (p-> s)==peremenst&&

!memcmp (p-> s,&vuvodstroki[chitarifvuragmoe], peremenst)) return p-> tp;

p = p-> dalee;

}

p = nachalo;

while (p) {

if (strlen (p-> s)==peremenst&&

!memcmp (p-> s,&vuvodstroki[chitarifvuragmoe], peremenst)) return p-> tp;

p = p-> dalee;

}

return 0;

}

char* ispolzovattype ()

{

types * p;

p = listtipov;

while (p) {

if (strlen (p-> s)==peremenst&&

!memcmp (p-> s,&vuvodstroki[chitarifvuragmoe], peremenst)) return p-> s;

p = p-> dalee;

}

}

void persvob (int gl){

var *p, *pp;

p = lnachalo;

while (p) {

pp = p;

p = p-> dalee;

delete pp;

}

lnachalo = NULL;

if (gl) {

p = nachalo;

while (p) {

pp = p;

p = p-> dalee;

delete pp;

}

nachalo = NULL;

}

}

int PoluchitSlovo ()

{

int st = 0;

char c;

peremenst = 0;

while (peremenst+chitarifvuragmoe< vvodimayast){

c = vuvodstroki[chitarifvuragmoe+peremenst];

switch (st){

case 0:

if (c==' ' || c=='t' || c=='n') st = 1;

else

if ((c> ='A' & & c< ='Z')||(c>='a' & & c< ='z')) st = 2;

else

if (c> ='0' & & c< ='9') st = 3;

else

if (

c=='.' || c< =',' || c > =':' || c< =';' ||

c=='+' || c< ='-' || c> ='*' || c< ='/' ||

c=='''

)

{ peremenst = 1; return perementype = klch_char; }

else { peremenst = 0; return perementype = klch_error; }

break;

case 1:

if (c==' ' || c=='t' || c=='n') peremenst++;

else return perementype = klch_space;

break;

case 2:

if (

(c> ='A' & & c< ='Z') ||

(c> ='a' & & c< ='z') ||

(c> ='0' & & c< ='9') ||

c=='_'

) peremenst++;

else return perementype = klch_str;

break;

case 3:

if (c> ='0' & & c< ='9') peremenst++; else

if (c=='. '&& vuvodstroki[chitarifvuragmoe+peremenst+1]≠'. ') {

peremenst++;

st = 5;

}

else{

peremennumf = 0;

return perementype = klch_numb;

}

break;

case 5:

if (c> ='0' & & c< ='9') peremenst++; else {

peremennumf = 1;

return perementype = klch_numb;

}

}

}

peremenst = 0;

return 0;

}

void put_stroku (char * s){

int l = strlen (s);

memcpy (& vuvodstrokivfail[vuvodimayast], s, l);

vuvodimayast += l;

}

int ghdg (char * m, char * s, int n){

int l = strlen (s);

if (n> l) l = n;

return memicmp (m, s, l);

}

void put_simvol (char c){

vuvodstrokivfail[vuvodimayast] = c;

vuvodimayast++;

}

void skopper (){

memcpy (& vuvodstrokivfail[vuvodimayast],&vuvodstroki[chitarifvuragmoe], peremenst);

chitarifvuragmoe += peremenst;

vuvodimayast += peremenst;

}

int kuro (char * s){

return (!ghdg (& vuvodstroki[chitarifvuragmoe], s, peremenst));

}

void otst (){

chitarifvuragmoe += peremenst;

}

void otstst (char * s){

strncpy (s,& vuvodstroki[chitarifvuragmoe], peremenst);

}

int PoluchitSlovoS (){

PoluchitSlovo ();

if (perementype==klch_space) {

otst ();

PoluchitSlovo ();

}

return perementype;

}

void inc_per ()

{

dt += 2;

}

void dec_per ()

{

dt -= 2;

}

void put_per ()

{

for (int i=0; i< dt; i++) put_simvol (' ');

}

void put_per11()

{

char s[10];

for (int i=0; i< dt; i++) {

sprintf (s,"%d", i/2);

put_stroku (s);

}

}

int GetFail (char * s1)

{

if ((file1 = fopen (s1, «rt»)) == NULL){

return 0;

}

fseek (file1, 0, SEEK_END);

vvodimayast = ftell (file1);

fseek (file1, 0, SEEK_SET);

if (vvodimayast> buferobmena) vvodimayast = buferobmena;

vvodimayast = fread (vuvodstroki, 1, vvodimayast, file1);

vuvodstroki[vvodimayast] = 0;

chitarifvuragmoe = 0;

vuvodimayast = 0;

return 1;

}

int PutFail (char * s2)

{

if ((file2 = fopen (s2, «wt»)) == NULL){

return 0;

}

fwrite (vuvodstrokivfail, vuvodimayast, 1, file2);

return 1;

}

void oshiblic ()

{

put_simvol ('n');

put_stroku («< Ошибка! > n»);

int k;

while (1){

PoluchitSlovoS ();

if (vuvodstroki[chitarifvuragmoe]== ';' || chitarifvuragmoe>= vvodimayast) {

skopper ();

break;

};

skopper ();

}

kolobop3++;

}

int flabel (int gl);

int Iskomentent (){

return (vuvodstroki[chitarifvuragmoe]==''

void komentEnd (){

if (vuvodstroki[chitarifvuragmoe]=='{'){

vuvodstrokivfail[vuvodimayast] = '/';

vuvodstrokivfail[vuvodimayast+1] = '*';

chitarifvuragmoe++;

vuvodimayast += 2;

while (vuvodstroki[chitarifvuragmoe]≠'}' & & chitarifvuragmoe< vvodimayast) {

if (chitarifvuragmoe> =vvodimayast) return;

vuvodstrokivfail[vuvodimayast] = vuvodstroki[chitarifvuragmoe];

chitarifvuragmoe++;

vuvodimayast++;

}

vuvodstrokivfail[vuvodimayast] = '*';

vuvodstrokivfail[vuvodimayast+1] = '/';

chitarifvuragmoe++;

vuvodimayast += 2;

}

else{

vuvodstrokivfail[vuvodimayast] = '/';

vuvodstrokivfail[vuvodimayast+1] = '*';

chitarifvuragmoe += 2;

vuvodimayast += 2;

while (!(vuvodstroki[chitarifvuragmoe]=='*' & & vuvodstroki[chitarifvuragmoe+1]==')')

& & chitarifvuragmoe< vvodimayast) {

if (chitarifvuragmoe> =vvodimayast) return;

vuvodstrokivfail[vuvodimayast] = vuvodstroki[chitarifvuragmoe];

chitarifvuragmoe++;

vuvodimayast++;

}

vuvodstrokivfail[vuvodimayast] = '*';

vuvodstrokivfail[vuvodimayast+1] = '/';

chitarifvuragmoe += 2;

vuvodimayast += 2;

}

put_simvol ('n');

}

int fkluchslovo (){

for (int i=0; i< klchh; i++){

if (!ghdg (& vuvodstroki[chitarifvuragmoe], kluchslovos[i], peremenst))

return i+1;

}

return 0;

}

int VuborTipaper (int svar, int gl){

char s[256];

int label;

int sp = 0;

PoluchitSlovoS ();

while (1){

if (perementype≠klch_str||fkluchslovo ()|| gl> 0&&sozdatvartype ()) return 0;

dobyachalovar (gl);

if (svar) {

s[sp] = '& ';

s[sp+1] = ' ';

sp += 2;

}

memcpy (& s[sp],&vuvodstroki[chitarifvuragmoe], peremenst);

chitarifvuragmoe += peremenst;

sp += peremenst;

PoluchitSlovoS ();

if (vuvodstroki[chitarifvuragmoe]==','){

s[sp]=',';

chitarifvuragmoe++;

sp++;

} else break;

PoluchitSlovoS ();

}

if (vuvodstroki[chitarifvuragmoe]==': '){

chitarifvuragmoe++;

PoluchitSlovoS ();

if ((perementype≠klch_str)& &(perementype≠klch_char)) return 0;

if (!ghdg (& vuvodstroki[chitarifvuragmoe],"boolean", peremenst)){

sozdatnovtype (gl, t_Bool);

put_stroku («int «);

otst ();

memcpy (& vuvodstrokivfail[vuvodimayast],&s[0], sp);

vuvodimayast += sp;

}

else

if (!ghdg (& vuvodstroki[chitarifvuragmoe],"real", peremenst)){

sozdatnovtype (gl, t_Real);

put_stroku («float «);

otst ();

memcpy (& vuvodstrokivfail[vuvodimayast],&s[0], sp);

vuvodimayast += sp;

}

else

if (!ghdg (& vuvodstroki[chitarifvuragmoe], ispolzovattype (), peremenst)){

put_stroku (ispolzovattype ());

put_stroku (««);

otst ();

memcpy (& vuvodstrokivfail[vuvodimayast],&s[0], sp);

vuvodimayast += sp;

}

else

if (!ghdg (& vuvodstroki[chitarifvuragmoe],"^", peremenst)){

otst ();

PoluchitSlovoS ();

sozdatnovtype (gl, varut ());

skopper ();

put_stroku («* «);

memcpy (& vuvodstrokivfail[vuvodimayast],&s[0], sp);

vuvodimayast += sp;

}

}

else if (label==kluchslovo_label) return 1;

else return 0;

return 1;

}

int fvar (int gl){

chitarifvuragmoe += peremenst;

PoluchitSlovoS ();

do{

kolobop1++;

if (Iskomentent ()){

komentEnd ();

kolobop2++;

continue;

}

put_per ();

if (fkluchslovo ()==kluchslovo_label)

{flabel (gl); }

if (!VuborTipaper (0,gl)) oshiblic ();

else kolobop2++;

PoluchitSlovoS ();

if (vuvodstroki[chitarifvuragmoe]≠'; ')

return 0;

otst ();

put_stroku («; n»);

PoluchitSlovoS ();

if (perementype≠klch_str || fkluchslovo ())

return 1;

}while (1);

}

int varfdes (){

chitarifvuragmoe += peremenst;

int k, svar;

PoluchitSlovoS ();

do{

k = fkluchslovo ();

svar = k==kluchslovo_var;

if (svar) {

otst ();

PoluchitSlovoS ();

}

if (!VuborTipaper (svar, 0)) return 0;

PoluchitSlovoS ();

if (vuvodstroki[chitarifvuragmoe]≠'; ') return 1;

otst ();

put_stroku («, «);

PoluchitSlovoS ();

k= fkluchslovo ();

if (perementype≠klch_str || k& &k≠kluchslovo_var) return 0;

}while (1);

}

int fbegin (int k);

int fgoto ()

{

otst ();

put_per ();

put_stroku («goto «);

PoluchitSlovoS ();

skopper ();

if (vuvodstroki[chitarifvuragmoe]≠'; ') return 0;

put_stroku («; n»);

chitarifvuragmoe++;

return 1;

}

int flabel (int gl)

{

otst ();

while (1){

if (perementype≠klch_str||fkluchslovo ()|| gl> 0&&sozdatvartype ()) return 0;

PoluchitSlovoS ();

dobyachalovar (gl);

sozdatnovtype (gl, t_Label);

otst ();

if (vuvodstroki[chitarifvuragmoe]==','){

chitarifvuragmoe++;

} else break;

};

if (vuvodstroki[chitarifvuragmoe]≠'; ') return 0;

chitarifvuragmoe++;

return 1;

}

int fread (int ln){

char s[256];

int sp;

int t;

otst ();

put_per ();

put_stroku («scanf»);

PoluchitSlovoS ();

if (vuvodstroki[chitarifvuragmoe]≠'(') return 0;

chitarifvuragmoe++;

put_stroku («(»");

sp=0;

while (1) {

PoluchitSlovoS ();

if (perementype≠klch_str) return 0;

t = sozdatvartype ();

/* if (t==t_Int) put_stroku («%d»);

else*/ if (t==t_Real) put_stroku («%f»);

else return 0;

s[sp] = '& ';

sp += peremenst;

memcpy (& s[sp],&vuvodstroki[chitarifvuragmoe], peremenst);

chitarifvuragmoe += peremenst;

sp += peremenst;

PoluchitSlovoS ();

if (vuvodstroki[chitarifvuragmoe]≠',') break;

s[sp] = vuvodstroki[chitarifvuragmoe];

chitarifvuragmoe++;

sp++;

}

put_stroku (««,»);

memcpy (& vuvodstrokivfail[vuvodimayast], s, sp);

vuvodimayast += sp;

PoluchitSlovoS ();

if (vuvodstroki[chitarifvuragmoe]≠')') return 0;

chitarifvuragmoe++;

put_simvol (')');

PoluchitSlovoS ();

if (vuvodstroki[chitarifvuragmoe]≠'; ') return 0;

chitarifvuragmoe++;

if (ln) put_stroku («; printf („\n“); n»);

else put_stroku («; n»);

return 1;

}

int farifvurag () {

PoluchitSlovoS ();

if (vuvodstroki[chitarifvuragmoe]=='+'){

skopper ();

}

else

if (vuvodstroki[chitarifvuragmoe]=='-'){

skopper ();

}

while (1){

PoluchitSlovoS ();

if (perementype==klch_numb) skopper (); else

if (perementype==klch_str& &sozdatvartype ()==t_Real) skopper (); else

if (perementype==klch_str& &sozdatvartype ()==t_Label) skopper (); else

if (vuvodstroki[chitarifvuragmoe]=='('){

skopper ();

if (!farifvurag ()) return 0;

PoluchitSlovoS ();

if (vuvodstroki[chitarifvuragmoe]≠')') return 0;

chitarifvuragmoe++;

put_simvol (')');

}

else return 0;

PoluchitSlovoS ();

char c = vuvodstroki[chitarifvuragmoe];

if (c=='+'||c=='-'||c=='*'||c=='/') skopper ();

else return 1;

}

}

int arifvurag (){

char c, c1;

if (!farifvurag ()) return 0;

PoluchitSlovoS ();

c = vuvodstroki[chitarifvuragmoe];

c1 = vuvodstroki[chitarifvuragmoe+1];

if (c=='< '&&c1=='>') {

chitarifvuragmoe += 2;

put_stroku («≠»);

}

else

if (c=='=') {

chitarifvuragmoe++;

put_stroku («==»);

}

else

if (c=='> '||c=='<') {

if (c1=='='){

chitarifvuragmoe += 2;

}

else skopper ();

}

PoluchitSlovoS ();

if (!farifvurag ()) return 0;

return 1;

}

int logvurag () {

int k;

char c, c1;

int arifm, ip, op;

while (1){

PoluchitSlovoS ();

k = fkluchslovo ();

int ip, op;

ip = chitarifvuragmoe;

op = vuvodimayast;

arifm = 0;

if (vuvodstroki[chitarifvuragmoe]=='+'||

vuvodstroki[chitarifvuragmoe]=='('||

vuvodstroki[chitarifvuragmoe]=='-'||

perementype==klch_str& &!fkluchslovo () ||

perementype==klch_numb)

arifm = arifvurag ();

if (!arifm){

chitarifvuragmoe = ip;

vuvodimayast = op;

PoluchitSlovoS ();

k = fkluchslovo ();

if (perementype==klch_str& &k==kluchslovo_true){

otst ();

put_simvol ('1');

}

else

if (perementype==klch_str& &k==kluchslovo_false) {

otst ();

put_simvol ('0');

}

else

if (perementype==klch_str& &sozdatvartype ()==t_Bool) skopper (); else

if (vuvodstroki[chitarifvuragmoe]=='('){

skopper ();

if (!logvurag ()) return 0;

PoluchitSlovoS ();

if (vuvodstroki[chitarifvuragmoe]≠')') return 0;

chitarifvuragmoe++;

put_simvol (')');

}

else return 0;

}

PoluchitSlovoS ();

k = fkluchslovo ();

if (k==kluchslovo_or) put_stroku («||»); else

if (k==kluchslovo_and) put_stroku («& &»);

else return 1;

otst ();

}

}

int asign (){

int type = sozdatvartype ();

if (!(type==t_Bool||type==t_Real||type==t_Label)) return 0;

put_per ();

skopper ();

PoluchitSlovoS ();

if ((type==t_Label)& &vuvodstroki[chitarifvuragmoe]==':')

{

skopper ();

chitarifvuragmoe++;

put_simvol ('n');

return 1;

}

if (vuvodstroki[chitarifvuragmoe]≠': '||vuvodstroki[chitarifvuragmoe+1]≠'=')

return 0;

put_simvol ('=');

chitarifvuragmoe += 2;

if (type==t_Bool) {

if (!logvurag ()) return 0;

}

else

if (!farifvurag ()) return 0;

PoluchitSlovoS ();

if (kuro («to»)) return 1;

if (vuvodstroki[chitarifvuragmoe]≠'; ') return 0;

skopper ();

put_simvol ('n');

return 1;

}

int fbegin (int gl){

int rep_n = 0;

if (gl≠3) otst ();

if (gl==1) put_stroku («nnvoid main ()n»);

if ((gl≠2)||(gl≠3)) {

put_per ();

put_stroku («{n»);

inc_per ();

}

int b;

do{

b = 1;

PoluchitSlovoS ();

if (Iskomentent ()){

komentEnd ();

continue;

}

switch (fkluchslovo ()){

case kluchslovo_begin:

kolobop1++;

if (!fbegin (0)) return 0;

kolobop2++;

break;

case kluchslovo_read:

kolobop1++;

if (!fread (0)) return 0;

kolobop2++;

break;

case kluchslovo_readln:

kolobop1++;

if (!fread (1)) return 0;

kolobop2++;

break;

case kluchslovo_goto:

kolobop1++;

if (!fgoto ()) return 0;

break;

case kluchslovo_end:

kolobop1++;

if (gl == 3) return 3;

otst ();

dec_per ();

put_per ();

put_stroku («}n»);

PoluchitSlovoS ();

if (gl==1& &vuvodstroki[chitarifvuragmoe]=='.' ||

gl≠1& &vuvodstroki[chitarifvuragmoe]==';'){

otst ();

kolobop2++;

return 1;

}

else

{

otst ();

return 0;

}

case 0:

if (!asign ()) return 0;

break;

default:

return 0;

}

} while (b);

return 1;

}

int PerevodOperatorov ()

{

int b;

int k;

kolobop1 = kolobop2 = 0;

put_stroku («#include < stdio. h>nn»);

do{

b = 1;

PoluchitSlovoS ();

k = fkluchslovo ();

if (k==kluchslovo_var){

kolobop1++;

if (!fvar (1)) {

oshiblic ();

}

else kolobop2++; }

else

if (k==kluchslovo_label)

{

kolobop1++;

if (!flabel (1)) oshiblic ();

}

else

if (k==kluchslovo_begin){

if (!fbegin (1)) {

oshiblic ();

}

b = 0;

}

else

if (Iskomentent ()) komentEnd ();

else {

kolobop1++;

oshiblic ();

};

} while (b==1);

if (vuvodstroki[chitarifvuragmoe]≠'. ') return 0;

chitarifvuragmoe++;

return 1;

}

void main ()

{

setlocale (LC_ALL,"Russian");

char s[128];

printf («Введите имя входного файла: «);

scanf («%s», s);

if (!GetFail (s))

{

printf («nОшибка открытия файла!»);

}

nachalo = NULL;

lnachalo = NULL;

unachalo = cusernachalo;

PerevodOperatorov ();

persvob (1);

printf («nВведите имя выходного файла: «);

scanf («%s», s);

if (!PutFail (s))

{

printf («nОшибка создания файла!»);

}

printf («nКоличество операторов»

" в исходном файле: %d", kolobop1);

printf («nКоличество операторов»

" в полученном файле: %d", kolobop2);

printf («nКоличество ошибочных операторов»

" которые не были обработаны: %d", kolobop3);

printf («nnРезультат хранится в файле: %s», s);

fclose (file1);

fclose (file2);

while (!kbhit ());

}

6. Распечатка тестов и результатов

Тест1: Пусть программа на Паскале:

label n1;

var

a, b, k, s: real;

{переменные }

begin

n1: read (a);

(*ввод переменной*)

readln (b);

k:= a + b;

goto n1;

end. f: f1;

l: ^f1;

i: integer;

{основнная часть программы}

begin

i: =1;

if i<3 then i: =+6; else i: =i-1;

end.

Тогда результат транслятора:

#include < stdio. h>

float a, b, k, s;

/*переменные */

void main ()

{

n1:

scanf («%f»,& a);

/*ввод переменной*/

scanf («%f»,& b); printf («n»);

k=a+b;

goto n1;

}

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

label n1;

var {раздел объявления переменных}

a, b, k, s: real;

{переменные }

begin

(*ввод переменной а*)

n1: read (a);

a:= a+1;

(*ввод переменной*)

readln (b);

b:= b+2;

k:= a + b;

goto n1;

end.

Результат транслятора:

Текст файла w2. txt

#include < stdio. h>

/*раздел объявления переменных*/

float a, b, k, s;

/*переменные */

void main ()

{

/*ввод переменной а*/

n1:

scanf («%f»,& a);

a=a+1;

/*ввод переменной*/

scanf («%f»,& b); printf («n»);

b=b+2;

k=a+b;

goto n1;

}

Тест 3. Изменим исходный файл еще раз. В этом случае добавим ошибочный оператор new ();.

label n1;

var {раздел объявления переменных}

a, b, k, s: real;

{переменные }

begin

(*ввод переменной а*)

n1: read (a);

a:= a+1;

(*ввод переменной*)

readln (b);

b:= b+2;

k:= a + b;

new (n1);

goto n1;

end.

Результатом будет вывод на экрана:

С выходным текстом:

#include < stdio. h>

/*раздел объявления переменных*/

float a, b, k, s;

/*переменные */

void main ()

{

/*ввод переменной а*/

n1:

scanf («%f»,& a);

a=a+1;

/*ввод переменной*/

scanf («%f»,& b); printf («n»);

b=b+2;

k=a+b;

< Ошибка! >

new (n1);

Выводы

Мы научились и получили возможность самостоятельно создать транслятор на языке С++ для перевода программ на языке Pascal в текст программы на языке С++. Данный курсовой проект позволил закрепить знания полученные на дисциплине «Программирование на языке высокого уровня».

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

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

1. Зайцева, Л. В. Алгоритмические языки и программирование [текст] / Л. В. Зайцева. — М.: МГГУ, 1996.

2. Фаронов, В. В. Программирование на ПЭВМ в среде Турбо-Паскаль [текст] / В. В. Фаронов. — М.: МГТУ, 1999.

3. Х. Дейтел, П. Дейтел. Как программировать на С. 2004. 1008 с.

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