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

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    211,27 kb
  • Опубликовано:
    2011-07-03
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

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

Федеральное агентство по образованию

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

"Северо-Кавказский государственный технический университет"

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

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



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

Студент Даюнов Сергей

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

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

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


Ставрополь

Оглавление

Введение

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

2. Внешняя спецификация программы

3. Описание алгоритма

4. Структура программы и описание функций и операторов

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

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

Выводы

Список литературы

Введение


Язык программирования - формализованный язык, предназначенный для описания программ и алгоритмов решения задач на ЭВМ. Языки программирования являются искусственными; в них синтаксис и семантика строго определены, поэтому они не допускают свободного толкования выражения, что характерно для естественного языка. Языки программирования разделяются на две основные категории: языки высокого уровня и языки низкого уровня.

Появление языков программирования было связано с осознанием того факта, что перевод алгоритма, написанного на "почти" естественном языке, на машинный язык может быть автоматизирован и, следовательно, возложен на плечи машины.

Язык программирования высокого уровня - язык программирования, разработанный для быстроты и удобства использования программистом.

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

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

Использование разнообразных трансляторов и интерпретаторов обеспечивает связь программ, написанных при помощи языков высокого уровня, с различными операционными системами и оборудованием, в то время как их исходный код остаётся, в идеале, неизменным.

Язык программирования Си отличается минимализмом. Компиляторы Си разрабатываются сравнительно легко благодаря относительно низкому уровню языка и скромному набору элементов.

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

трансляция паскаль алгоритм листинг программа

Нам необходимо написать конвертор на языке Си для перевода программ на языке Паскаль в текст программы на языке Си. Языки, операторы в исходном тексте, синтаксис арифметических и логических выражений определяются в соответствии с номером варианта.

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

В одной строке исходного текста может быть несколько операторов или только часть одного оператора. При формировании выходного текста можно не учитывать правило отступа.

Индивидуальное задание:

Языки, допустимые операторы в исходном тексте, синтаксис арифметических и логических выражений в соответствии с вариантом задания (табл.1):

Табл.1. Вариант задания

№ вар-та

Мини-транслятор Паскаль - Си (вид Аe, Le и номера операторов )


арифм. выраж.

логич. выраж.

тип

операторы

7

Ae1 (рис.1)

Le1 (рис.2)

boolean

while Le do

файлы

assign, rewrite, write


Рис.1. Логическое выражение ae1

Рис.2. Логическое выражение le1

2. Внешняя спецификация программы


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

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

Также на экран будет выведена статистика о количестве всех оператор в исходном файле, в полученном программном коде и количестве ошибочных или необработанных операторов.

Полученная программа будет совместима с MS-DOS и со всеми операционными системами семейства Windows существующим на данное время.

3. Описание алгоритма


Транслятор - программа или техническое средство, выполняющее преобразование программы, представленной на одном из языков программирования, в программу на другом языке и, в определённом смысле, равносильную первой. Целью трансляции является преобразование текста с одного языка на другой, который понятен адресату текста. Они бывают двух разновидностей: компиляторы и интерпритаторы.

Исходное текстовое представление программы не очень пригодно для работы компилятора, поэтому во время анализа программа прежде всего разбивается на последовательность строк, или, как принято говорить, лексем. Базовое множество состоит из следующих групп лексем:

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

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

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

·        Знак операции. Лексема, обозначающая некоторую операцию, определенную в языке. (Заметим, что некоторые операции обозначаются посредством служебных слов.)

·        Разделитель (пунктуатор). Лексема, используемая для отделения синтаксических конструкций друг от друга, и/или для повышения наглядности конструкций языка, и/или для снятия синтаксических неоднозначностей. В данную группу включены лексемы препроцессора # и ##, обрабатываемые на фазе препроцессирования.

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

Следующая принципиальная схема (рис. 3.1) иллюстрирует последовательность фаз трансляции. Ниже даются краткие комментарии по содержанию этих фаз.

Фаза 1: Предварительная обработка. Отображение символов исходного текста в базовое множество символов внутреннего представления, с заменой триграфов и формированием, при необходимости, универсальных имен-символов.

Фаза 2: "Склеивание" строк. Строка исходного текста, завершающаяся символом "обратная косая черта", соединяется (с отбрасыванием конца строки и данного символа) с последующей.

Фаза 3: Первичный лексический анализ. Декомпозиция исходного текста на лексемы препроцессора с удалением комментариев и, быть может, заменой последовательностей пробельных символов на один пробел.

Фаза 4: Препроцессирование. Выполнение директив препроцессора и реализация макрорасширений. В частности, обработка директивы #include приводит к рекурсивному выполнению фаз 1-4 для исходного текста из заданного в этой директиве файла. На этой фазе, строго говоря, возникает понятие единицы трансляции, которое в контексте данного изложения можно определить как исходный текст, полученный, возможно, из нескольких исходных файлов применением операции препроцессирования.

Фаза 6: Конкатенация литералов. Конкатенация соседних строковых литералов в единую лексему.

Фаза 7: Собственно трансляция. Окончательный лексический анализ (преобразование лексем препроцессора в лексемы), синтаксический и семантический анализ. "Полученные в результате лексемы синтаксически и семантически анализируются и транслируются".

Фаза 8: Пост-обработка настроек шаблонов. Единица трансляции, прошедшая обработку на фазах 1-7, проверяется на предмет вхождения в нее настроек шаблонов, объявленных в других единицах трансляции. Если такие вхождения имеются, они настраиваются с привлечением информации о таких шаблонах из других единиц трансляции.

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

Рис 3.1. Фазы трансляции

Данная фаза традиционно называется редактированием связей или комплексацией. Системы, принципиально ориентированные на создание многомодульных программ и раздельную компиляцию, реализуют эту фазу в виде отдельного процессора - компоновщика или редактора связей.

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

4. Структура программы и описание функций и операторов

Назначение подпрограмм:

main_analiz - главная программа прохода по тексту

f_comments - подпрограмма обработки комментариев

while - подпрограмма обработки оператора while- подпрограмма обработки операторных скобок

reset - подпрограмма обработки конструкции reset- подпрограмма обработки операций присваивания

ael - подпрограмма обработки арифметических и логических выражений

cpy - подпрограмма копирования слова во внешний файл без изменений

fassign - подпрограмма обработки выражения assign преобразует его в fopen- подпрограмма анализа нетерминальных символов

var - подпрограмма обработки раздела переменных

errs - подпрограмма обработки ошибок- подпрограмма проверки символа или слова на идентификацию с ранее объявленной переменной. Обрабатывает так же и тип этой переменной.

Таблица 4.1 - Таблица номеров идентификации для ключевых слов

Ключевое слово

Идентификационный номер

begin

1

end

2

var

3

boolean

4

false

5

true

6

while

7

do

8

and

9

or

10

assign

11

read

12

reset

13


Таблица 4.2 - Таблица идентификаторов типов переменных

Тип

Идентификационный номер

Целочисленный

1

Логический

2

Файлы

3

Описание констант, переменных и функций программы.

Константы и переменные

buflen - ограничение на объем исходного текстового файла. Применяется как для массива данных входного файла, так и для конечного файла.

KWn - количество, показывающее размер словаря ключевых слов. В данной программе эта константа равна 13.

wlen - показывает количество символов в текущем слове.

insource - массив хранящий исходный текст программы.

outsource - массив хранящий число обработанных строк.

op_f_in - количество обработанных операторов в файле с результатом трансляции.

File1 - исходный текстовый файл.

File2- файл с результатом трансляции.

outspos - длина файла с результатом трансляции.

ker - содержит число необработанных и ошибочных операторов, а так же конструкций.

vlst - ссылка на глобальные переменные.

op_f_out - число успешно компилированных операторов, которые будут содержаться в выходном файле.

KWn - содержит число обработанных ключевых слов на языке.

KWs - массив, содержащий число слова. В зависимости от порядка записи в нем ключевых слов, составляется таблица идентификаторов.

inspos - идентификатор-указатель в файле с результатом трансляции.

globalID - переменная-идентификатор глобальной переменной.

wt_type - переменная, в которая определяет тип слова.

Функции и процедуры

void inc_dt() - увеличивает отступ.

void dec_dt() - уменьшает отступ.

void put_dt() - печатает в файле с результатом трансляции.

int frfile(char * s1) - добавляет в массив исходный текст из файла.

int tofl(char * s2) - перемещает текст из массива в файле с результатом трансляции.

void ErrOp() - обработка ошибочного оператора.

int flabel(int globalID) - обработка оператора flabel.

int IsComment() - обработка начала комментария.

void CommEnd() - обработка конца комментария.

int gettype() - функция пропускает пробелы или слова (в зависимости от того где был курсор)

int IsAssign() - функция обработки операции присваивания

int fIntRealBoolAr(int svar, int globalID) - обрабатывает тип переменных.

int fvar(int globalID) - функция обрабатывает блок переменных, на выбор запускает либо int fIntRealBoolAr(int svar, int globalID), либо int flabel(int globalID).

int analyseWords() - пропускает пробелы и переходит к запуску analyseWord.

int analyseWord() - Основная функция получения слова, анализирует символы программы. Функция возвращает один из следующих кодов:

w_w_err - Идентификатор ошибочного оператора.

w_w_sp - Идентификатор символа пробела.

w_w_str - Идентификатор строки.

w_w_n - Идентификатор числа.

w_w_c - Любые символы разделителию.

void wcopy() - копирует слово из исходного файла в файле с результатом трансляции не изменяя его.

int if_it_equ(char * s) - проверяет эквивалентность слова во исходном файле со строкой входящей в функцию.

int get_vartype() - функция возвращает тип переменной (если тот был заранее задан).

int f_logic() - функция обработки логического выражения

int gettype() - функция пропускает пробелы или слова (в зависимости от того где был курсор)

int IsAssign() - функция обработки операции присваивания

int str_cmp(char * m, char * s, int n) - использует функцию memicmp с некоторыми предопределенными данными.

void putsrt(char * s) - добавляет строку в файле с результатом трансляции.

void put_char(char c) - добавляет символ в файле с результатом трансляции.

int f_arithmetic() - вспомогательная подфункция обработки арифметического выражения.

int ae() - функция обработки арифметического выражения.

int freset() - функция обработки freset.

int IsBegin(int k) - одна из основных функций обработки "тела" программы. Выбирает запуск подпрограмм.

int yaVarProc() - обработка блока описания переменных.

int f_record() - функция обработки конструкции record.

void put_dt() - печатает в файле с результатом трансляции.

int add_varInList(int isglobal) - Добавляет обработанное слово как переменную в список глобальных или локальных переменных.

void settype(int globalID, int type) - полностью перебирает список локальных и глобальных переменных.

void word_string(char * s) - использует функцию strncpy с заранее указанным выходящим файлом.

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


#include <conio.h>

#include <stdio.h>

#include <string.h>

#include <locale.h>*file1, *file2;int buflen = 10000;int KWn = 13;* KWs[KWn] =

{

"begin", "end", "var", "boolean",

"false", "true", "while", "do",

"and", "or", "assign", "read",

"reset"

};// Словарь ключевых слов

#define key_wrd_begin 1

#define key_wrd_end 2

#define key_wrd_var 3

#define key_wrd_boolean 4

#define key_wrd_false 5

#define key_wrd_true 6

#define key_wrd_while 7

#define key_wrd_do 8

#define key_wrd_and 9

#define key_wrd_or 10

#define key_wrd_assign 11

#define key_wrd_read 12

#define key_wrd_reset 13

#define t_t_bool 2

#define t_t_file 3

// идентификаторы возможных типов слов

#define w_w_err 0 // Идентификатор ошибочного оператора

#define w_w_sp 1 // Идентификатор символа пробела

#define w_w_str 2 // Идентификатор строки

#define w_w_n 3 // Идентификатор числа

#define w_w_c 4 // Любые символы разделители, такие как \n \t и тд

//собственно это наши входные и выходные большие строки, в эти большие

//строки записываются также символы конца строки '\n', что и используется в дальнейшем для формирования выходного теста построчно

char insource[buflen],[buflen];inlen,outspos,inspos; ;//текущие позиции op_f_in,op_f_out,ker; ;//эти переменные считают количество операторов во входном, выходном файле и кол-во ошибок

int wlen; //длина "слова"

int wt_type; //тип "слова"

int wnumf; //0 - целое число, 1 - дробное

int dt; //размер отступа (от начала строки)

typedef struct var{s[64];tp;* next;

};struct types{s[64];tid;* next;

};*vlst, *lvlst; ; //списки переменных* typeslist;fle();addvar(int globalID){*np, *p;(globalID) p = vlst; else p = lvlst;(p) {(strlen(p->s)==wlen&&

!memcmp(p->s,&insource[inspos],wlen)) return 0;= p->next;

}= new var;(np->s,&insource[inspos],wlen);>s[wlen]=0;>tp = -1;(globalID) {>next = vlst;= np;

} else {>next = lvlst;= np;

}1;

}settype(int globalID, int type){*p;(globalID) p = vlst; else p = lvlst;(p) {(p->tp==-1) p->tp = type;= p->next;

}

}gettype(){* p;= lvlst;(p) {(strlen(p->s)==wlen&&

!memcmp(p->s,&insource[inspos],wlen)) return p->tp;= p->next;

}= vlst;(p) {(strlen(p->s)==wlen&&

!memcmp(p->s,&insource[inspos],wlen)) return p->tp;= p->next;

}0;

}clearl(int globalID){*p, *pp;= lvlst;(p) {= p;= p->next;pp;

}= NULL;(globalID) {= vlst;(p) {= p;= p->next;pp;

}= NULL;

}

}getsymbol()

{st = 0;c;= 0;(wlen+inspos<inlen ){= insource[inspos+wlen];(st){0:(c==' ' || c=='\t' || c=='\n') st = 1;((c>='A' && c<='Z')||(c>='a' && c<='z')) st = 2;(c>='0' && c<='9') st = 3;(=='.' || c<=',' || c >=':' || c<=';' ||=='+' || c<='-' || c>='*' || c<='/' ||=='\''

)

{ wlen = 1; return wt_type = w_w_c; }{ wlen = 0; return wt_type = w_w_err; };1:(c==' ' || c=='\t' || c=='\n') wlen++;return wt_type = w_w_sp;;2:(

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

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

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

) wlen++;return wt_type = w_w_str;;3:(c>='0' && c<='9') wlen++; else(c=='.'&& insource[inspos+wlen+1]!='.') {++;= 5;

}{= 0;wt_type = w_w_n;

};5:(c>='0' && c<='9') wlen++; else {= 1;wt_type = w_w_n;

}

}

}= 0;0;

}putsrt(char * s){l = strlen(s);(&outsource[outspos],s,l);+= l;

}scmp(char * m, char * s, int n){l = strlen(s);(n>l) l = n;memicmp(m,s,l);

}put_char(char c){[outspos] = c;++;

}wcopy(){(&outsource[outspos],&insource[inspos],wlen);+= wlen;+= wlen;

}wequ(char * s){(!scmp(&insource[inspos],s,wlen));

}wskip(){+= wlen;

}wstr(char * s){(s,&insource[inspos],wlen);

}analyseWord(){();(wt_type==w_w_sp) {();();

}wt_type;

}inc_dt()

{+= 2;

}dec_dt()

{-= 2;

}put_dt()

{(int i=0; i<dt; i++) put_char(' ');

}put_dt11()

{s[10];(int i=0; i<dt; i++) {(s,"%d",i/2);(s);

}

}frfile(char * s1)

{((file1 = fopen(s1, "rt")) == NULL){0;

}(file1, 0, SEEK_END);= ftell(file1);(file1, 0, SEEK_SET);(inlen>buflen) inlen = buflen;= fread(insource,1,inlen,file1);[inlen] = 0;= 0;= 0;1;

}tofl(char * s2)

{((file2 = fopen(s2, "wt")) == NULL){0;

}(outsource,outspos,1,file2);1;

{_char('\n');("< Ошибка! > \n");k;(1){();(insource[inspos]== ';' || inspos>= inlen) {();;

};();

}++;

}flabel(int globalID);IsComment(){(insource[inspos]=='{' ||[inspos]=='(' ||insource[inspos+1]=='*');

}CommEnd(){(insource[inspos]=='{'){[outspos] = '/';[outspos+1] = '*';++;+= 2;(insource[inspos]!='}' && inspos<inlen) {(inspos>=inlen) return;[outspos] = insource[inspos];++;++;

}[outspos] = '*';[outspos+1] = '/';++;+= 2;

}{[outspos] = '/';[outspos+1] = '*';+= 2;+= 2;(!(insource[inspos]=='*' && insource[inspos+1]==')')

&& inspos<inlen) {(inspos>=inlen) return;[outspos] = insource[inspos];++;++;

}[outspos] = '*';[outspos+1] = '/';+= 2;+= 2;

}_char('\n');

}fkW(){(int i=0; i<KWn; i++){(!scmp(&insource[inspos],KWs[i],wlen))i+1;

}0;

}fIntRealBoolAr(int svar, int globalID){s[256];label;sp = 0;();(1){(wt_type!=w_w_str||fkW()|| globalID>0&&gettype() ) return 0;(globalID);(svar) {[sp] = '&';[sp+1] = ' ';+= 2;

}(&s[sp],&insource[inspos],wlen);+= wlen;+= wlen;();(insource[inspos]==','){[sp]=',';++;++;

} else break;();

}(insource[inspos]==':'){++;();(wt_type!=w_w_str) return 0;(!scmp(&insource[inspos],"boolean",wlen)){(globalID,t_t_bool);("int ");();(&outsource[outspos],&s[0],sp);+= sp;

}(!scmp(&insource[inspos],"integer",wlen)){(globalID,t_t_int);("int ");();(&outsource[outspos],&s[0],sp);+= sp;

}(wequ("file"))

{();();(!wequ("of")) return 0;();();("FILE *");(&outsource[outspos],&s[0],sp);+= sp;();(globalID,t_t_file);

}

}return 0;1;

}fvar(int globalID){+= wlen;();{_f_in++;(IsComment()){();_f_out++;;

}_dt();(!fIntRealBoolAr(0,globalID)) ErrOp();op_f_out++;();(insource[inspos]!=';')0;();(";\n");();(wt_type!=w_w_str || fkW())1;

}while(1);

}

fvardescr(){+= wlen;k,svar;();{= fkW();= k==key_wrd_var;(svar) {();();

}(!fIntRealBoolAr(svar,0)) return 0;();(insource[inspos]!=';') return 1;();(", ");();= fkW();(wt_type!=w_w_str || k&&k!=key_wrd_var) return 0;

}while(1);

}fbegin(int k);fprocedure(){();("\nvoid ");();(wt_type!=w_w_str||gettype()) return 0;(1);(1,10);();();(insource[inspos]!='(') return 0;_char('(');(!fvardescr()) return 0;();(insource[inspos]!=')') return 0;();();(insource[inspos]!=';') return 0;();("\n{\n");_dt();b;{= 1;();(!scmp(&insource[inspos],"var",wlen)){_f_in++;(!fvar(0)) return 0;

}(!scmp(&insource[inspos],"begin",wlen)){(!fbegin(2)) return 0;= 0;

}(IsComment()) CommEnd();return 0;

} while (b==1);(0);++;1;

}freset()

{();(insource[inspos]!='(') return 0;++;();();(insource[inspos]!=')') return 0;++;(insource[inspos]!=';') return 0;++;1;

}fassign()

{t;();(insource[inspos]!='(') return 0;++;();(t = gettype())

{(t==t_t_file)

{_dt();();(" = fopen(\"");(insource[inspos]!=',') return 0;+=2;(insource[inspos]!= '\'')

{[outspos] = insource[inspos];++;++;

}++;("\"");(",\"w\"");();(insource[inspos]!=')') return 0;++;(")");(insource[inspos]!=';') return 0;++;(";\n");1;

}

}1;

}fread(int ln){s[256];sp;t;();_dt();();(insource[inspos]!='(') return 0;++;();(t = gettype())

{(t==t_t_file)

{("fscanf(");();(insource[inspos]!=',') return 0;++;(",");(insource[inspos]!= ')')

{[outspos] = insource[inspos];++;++;

}();(insource[inspos]!=')') return 0;++;(")");(insource[inspos]!=';') return 0;++;(";\n");1;

}

}("scanf");("(\"");=0;(1) {();(wt_type!=w_w_str) return 0;= gettype();(t==t_t_int) putsrt("%d");return 0;[sp] = '&';+= wlen;();(&s[sp],&insource[inspos],wlen);+= wlen;+= wlen;();(insource[inspos]!=',') break;[sp] = insource[inspos];++;++;

}("\",");(&outsource[outspos],s,sp);+= sp;();(insource[inspos]!=')') return 0;++;_char(')');();(insource[inspos]!=';') return 0;++;(ln) putsrt("; printf(\"\\n\");\n");putsrt(";\n");1;

}fae() {();(insource[inspos]=='+'){();

}(insource[inspos]=='-'){();

}(1){();(wt_type==w_w_n) wcopy(); else(wt_type==w_w_str&&gettype()==t_t_int) wcopy(); else(insource[inspos]=='('){();(!fae()) return 0;();(insource[inspos]!=')') return 0;++;_char(')');

}return 0;();c = insource[inspos];(c=='+'||c=='-'||c=='*'||c=='/') wcopy();return 1;

}

}ae(){c,c1;(!fae()) return 0;();= insource[inspos];= insource[inspos+1];(c=='<'&&c1=='>') {+= 2;("!=");

}(c=='=') {++;("==");

}(c=='>'||c=='<') {(c1=='='){+= 2;

}wcopy();

}();(!fae()) return 0;1;

}fle() {k;c,c1;arifm, ip,op;(1){();= fkW();ip, op;= inspos;= outspos;= 0;(insource[inspos]=='+'||[inspos]=='('||[inspos]=='-'||_type==w_w_str&&!fkW() ||_type==w_w_n)= ae();(!arifm){= ip;= op;();= fkW();(wt_type==w_w_str&&k==key_wrd_true){();_char('1');

}(wt_type==w_w_str&&k==key_wrd_false) {();_char('0');

}(wt_type==w_w_str&&gettype()==t_t_bool) wcopy(); else(insource[inspos]=='('){();(!fle()) return 0;();(insource[inspos]!=')') return 0;++;_char(')');

}return 0;

}();= fkW();(k==key_wrd_or) putsrt("||"); else(k==key_wrd_and) putsrt("&&");return 1;();

}

}asign(){type = gettype();(!(type==t_t_bool||type==t_t_int)) return 0;_dt();();();(insource[inspos]!=':'||insource[inspos+1]!='=')0;_char('=');+= 2;(type==t_t_bool) {(!fle()) return 0;

}(!fae()) return 0;();(insource[inspos]!=';') return 0;();_char('\n');1;

}frepeat() {();_dt();("do {\n");_dt();1;

}funtil() {();_dt();_dt();("} while (");(!fle()) return 0;_char(')');();(insource[inspos]!=';') return 0;++;(";\n");1;

}fbegin(int globalID){rep_n = 0;(globalID!=3) wskip();(globalID==1) putsrt("\n\nvoid main()\n");((globalID!=2)||(globalID!=3)) {_dt();("{\n");_dt();

}b;{= 1;();(IsComment()){();;

}(fkW()){key_wrd_begin:_f_in++;(!fbegin(0)) return 0;_f_out++;;key_wrd_read:_f_in++;(!fread(0)) return 0;_f_out++;;key_wrd_reset:_f_in++;(!freset()) return 0;_f_out++;;key_wrd_assign:_f_in++;(!fassign()) return 0;_f_out++;;key_wrd_while:_f_in++;(!fwhile()) return 0;_f_out++;;key_wrd_end:_f_in++;(globalID == 3) return 3;();_dt();_dt();("}\n");();(global0049D==1&&insource[inspos]=='.' ||!=1&&insource[inspos]==';'){();_f_out++;1;

}

{();0;

}0:(!asign()) return 0;;:0;

}

} while (b);1;

}Translate()

{b;k;_f_in = op_f_out = 0;("#include <stdio.h>\n\n");{= 1;();= fkW();(k==key_wrd_var){_f_in++;(!fvar(1)) {();

}op_f_out++; }(k==key_wrd_begin){(!fbegin(1)) {();

}= 0;

}(IsComment()) CommEnd();{_f_in++;();

};

} while (b==1);(insource[inspos]!='.') return 0;++;1;

}main()

{(LC_ALL,"Russian");s[128];("Входной файл: ");("%s",s);(!frfile(s))

{("\nОшибка ввода!");();;

}= NULL;= NULL;_anliz();(1);("\nНовый файл:");("%s",s);(!tofl(s))

{("\nОшибка ввода!");();;

}

printf("\nВ исходном файле было обработано"

" %d операторов.", op_f_in);

printf("\nВ новом файле"

" : %d операторов", op_f_out);

printf("\nНеобработанных и ошибочных"

" операторов: %d", ker);

printf("\n\nРезультат: %s",s);(infl);(outfl);(!kbhit()) ;

}

 

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


Входной файл 7.pas:

,k:integer;:file of integer;(fl,'c:tuc\tuc.txt');(fl);(fl,bla);(i);:=500;:=10;(i=k) do:=i-k;;.

Вид экрана:


Выходной файл:

#include <stdio.h>i,k;*fl;main()

{= fopen("c:tuc\tuc.txt","w");(fl,bla);("%d",&i);=500;=10;((i==k))

{=i-k;

}

}

Пример ошибочного ввода:


Файл с ошибочным оператором:

var,k:integer;

fl:file of integer;(fl,'c:tuc\tuc.txt');(fl);(fl,bla);(i);:=500;:=10;(i=k) do:=i-k;(30);

end;.

Вид экрана:


Выходной файл:

#include <stdio.h>i,k;*fl;main()

{= fopen("c:tuc\tuc.txt","w");(fl,bla);("%d",&i);=500;=10;((i==k))

{=i-k;

< Ошибка! >(30);

Выводы


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

В результате работы была написана программа - конвертор на языке СИ для перевода программ на Pascal в текст программы на языке СИ.

Список литературы


1.      Герберт Шилдт., "Полный справочник по С++", Ossborne, 2003.

2.      Зайцева Л. В., "Алгоритмические языки и программирование", МГГУ, 1996.

3.      Карпов Б., Баранов Т., "С++: специальный справочник", СПб.: Питер, 2001.

4.      Культин Н., "С/С++ в задачах и примерах", СПб.:БХВ-Петербург, 2002.

5.      Стивен Прата, "Язык программирования С", М. Издательство "Диасофт", 2002.

6.      Фёдоров А., "Особенности программирования на Borland Pascal", Киев: "Диалектика", 1994.

Похожие работы на - Транслятор для перевода программ с языка Паскаль в текст программы на языке Си

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!