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

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 03.07.2011
Размер файла 305,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

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

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

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

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

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

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

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

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

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

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

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

Ставрополь

2011

Оглавление

  • Введение
  • 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 для исходного текста из заданного в этой директиве файла. На этой фазе, строго говоря, возникает понятие единицы трансляции, которое в контексте данного изложения можно определить как исходный текст, полученный, возможно, из нескольких исходных файлов применением операции препроцессирования.

Фаза 5: Обработка литералов. Преобразование содержимого символьных и строковых литералов к внутреннему виду.

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

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

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

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

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

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

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

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

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

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

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

while - подпрограмма обработки оператора while

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

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

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

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

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

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

analyseWord - подпрограмма анализа нетерминальных символов

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

errs - подпрограмма обработки ошибок

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

Таблица 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 - содержит число необработанных и ошибочных операторов, а так же конструкций.

lvlst - ссылка на локальные переменные.

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>

FILE *file1, *file2;

const int buflen = 10000;

const int KWn = 13;

char * 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_int 1

#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],

outsource[buflen];

int inlen,outspos,inspos; ;//текущие позиции

int op_f_in,op_f_out,ker; ;//эти переменные считают количество операторов во входном, выходном файле и кол-во ошибок

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

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

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

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

typedef struct var{

char s[64];

int tp;

var * next;

};

typedef struct types{

char s[64];

int tid;

types * next;

};

var *vlst, *lvlst; ; //списки переменных

types * typeslist;

int fle();

int addvar(int globalID){

var *np, *p;

if (globalID) p = vlst; else p = lvlst;

while (p) {

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

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

p = p->next;

}

np = new var;

memcpy(np->s,&insource[inspos],wlen);

np->s[wlen]=0;

np->tp = -1;

if (globalID) {

np->next = vlst;

vlst = np;

} else {

np->next = lvlst;

lvlst = np;

}

return 1;

}

void settype(int globalID, int type){

var *p;

if (globalID) p = vlst; else p = lvlst;

while (p) {

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

p = p->next;

}

}

int gettype(){

var * p;

p = lvlst;

while (p) {

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

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

p = p->next;

}

p = vlst;

while (p) {

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

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

p = p->next;

}

return 0;

}

void clearl(int globalID){

var *p, *pp;

p = lvlst;

while (p) {

pp = p;

p = p->next;

delete pp;

}

lvlst = NULL;

if (globalID) {

p = vlst;

while (p) {

pp = p;

p = p->next;

delete pp;

}

vlst = NULL;

}

}

int getsymbol()

{

int st = 0;

char c;

wlen = 0;

while (wlen+inspos<inlen ){

c = insource[inspos+wlen];

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=='\''

)

{ wlen = 1; return wt_type = w_w_c; }

else { wlen = 0; return wt_type = w_w_err; }

break;

case 1:

if (c==' ' || c=='\t' || c=='\n') wlen++;

else return wt_type = w_w_sp;

break;

case 2:

if (

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

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

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

c=='_'

) wlen++;

else return wt_type = w_w_str;

break;

case 3:

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

if (c=='.'&& insource[inspos+wlen+1]!='.') {

wlen++;

st = 5;

}

else{

wnumf = 0;

return wt_type = w_w_n;

}

break;

case 5:

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

wnumf = 1;

return wt_type = w_w_n;

}

}

}

wlen = 0;

return 0;

}

void putsrt(char * s){

int l = strlen(s);

memcpy(&outsource[outspos],s,l);

outspos += l;

}

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

int l = strlen(s);

if (n>l) l = n;

return memicmp(m,s,l);

}

void put_char(char c){

outsource[outspos] = c;

outspos++;

}

void wcopy(){

memcpy(&outsource[outspos],&insource[inspos],wlen);

inspos += wlen;

outspos += wlen;

}

int wequ(char * s){

return (!scmp(&insource[inspos],s,wlen));

}

void wskip(){

inspos += wlen;

}

void wstr(char * s){

strncpy(s,&insource[inspos],wlen);

}

int analyseWord(){

getsymbol();

if (wt_type==w_w_sp) {

wskip();

getsymbol();

}

return wt_type;

}

void inc_dt()

{

dt += 2;

}

void dec_dt()

{

dt -= 2;

}

void put_dt()

{

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

}

void put_dt11()

{

char s[10];

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

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

putsrt(s);

}

}

int frfile(char * s1)

{

if ((file1 = fopen(s1, "rt")) == NULL){

return 0;

}

fseek(file1, 0, SEEK_END);

inlen = ftell(file1);

fseek(file1, 0, SEEK_SET);

if (inlen>buflen) inlen = buflen;

inlen = fread(insource,1,inlen,file1);

insource[inlen] = 0;

inspos = 0;

outspos = 0;

return 1;

}

int tofl(char * s2)

{

if ((file2 = fopen(s2, "wt")) == NULL){

return 0;

}

fwrite(outsource,outspos,1,file2);

return 1;

}

void ErrOp()

{

put_char('\n');

putsrt("< Ошибка! > \n");

int k;

while (1){

analyseWord();

if (insource[inspos]== ';' || inspos>= inlen) {

wcopy();

break;

};

wcopy();

}

ker++;

}

int flabel(int globalID);

int IsComment(){

return (insource[inspos]=='{' ||

insource[inspos]=='(' ||insource[inspos+1]=='*');

}

void CommEnd(){

if (insource[inspos]=='{'){

outsource[outspos] = '/';

outsource[outspos+1] = '*';

inspos++;

outspos += 2;

while (insource[inspos]!='}' && inspos<inlen) {

if (inspos>=inlen) return;

outsource[outspos] = insource[inspos];

inspos++;

outspos++;

}

outsource[outspos] = '*';

outsource[outspos+1] = '/';

inspos++;

outspos += 2;

}

else{

outsource[outspos] = '/';

outsource[outspos+1] = '*';

inspos += 2;

outspos += 2;

while (!(insource[inspos]=='*' && insource[inspos+1]==')')

&& inspos<inlen) {

if (inspos>=inlen) return;

outsource[outspos] = insource[inspos];

inspos++;

outspos++;

}

outsource[outspos] = '*';

outsource[outspos+1] = '/';

inspos += 2;

outspos += 2;

}

put_char('\n');

}

int fkW(){

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

if (!scmp(&insource[inspos],KWs[i],wlen))

return i+1;

}

return 0;

}

int fIntRealBoolAr(int svar, int globalID){

char s[256];

int label;

int sp = 0;

analyseWord();

while (1){

if (wt_type!=w_w_str||fkW()|| globalID>0&&gettype() ) return 0;

addvar(globalID);

if (svar) {

s[sp] = '&';

s[sp+1] = ' ';

sp += 2;

}

memcpy(&s[sp],&insource[inspos],wlen);

inspos += wlen;

sp += wlen;

analyseWord();

if (insource[inspos]==','){

s[sp]=',';

inspos++;

sp++;

} else break;

analyseWord();

}

if (insource[inspos]==':'){

inspos++;

analyseWord();

if (wt_type!=w_w_str) return 0;

if (!scmp(&insource[inspos],"boolean",wlen)){

settype(globalID,t_t_bool);

putsrt("int ");

wskip();

memcpy(&outsource[outspos],&s[0],sp);

outspos += sp;

}

else

if (!scmp(&insource[inspos],"integer",wlen)){

settype(globalID,t_t_int);

putsrt("int ");

wskip();

memcpy(&outsource[outspos],&s[0],sp);

outspos += sp;

}

else

if(wequ("file"))

{

wskip();

analyseWord();

if(!wequ("of")) return 0;

wskip();

analyseWord();

putsrt("FILE *");

memcpy(&outsource[outspos],&s[0],sp);

outspos += sp;

wskip();

settype(globalID,t_t_file);

}

}

else return 0;

return 1;

}

int fvar(int globalID){

inspos += wlen;

analyseWord();

do{

op_f_in++;

if (IsComment()){

CommEnd();

op_f_out++;

continue;

}

put_dt();

if (!fIntRealBoolAr(0,globalID)) ErrOp();

else op_f_out++;

analyseWord();

if (insource[inspos]!=';')

return 0;

wskip();

putsrt(";\n");

analyseWord();

if (wt_type!=w_w_str || fkW())

return 1;

}while(1);

}

int fvardescr(){

inspos += wlen;

int k,svar;

analyseWord();

do{

k = fkW();

svar = k==key_wrd_var;

if (svar) {

wskip();

analyseWord();

}

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

analyseWord();

if (insource[inspos]!=';') return 1;

wskip();

putsrt(", ");

analyseWord();

k= fkW();

if (wt_type!=w_w_str || k&&k!=key_wrd_var) return 0;

}while(1);

}

int fbegin(int k);

int fprocedure(){

wskip();

putsrt("\nvoid ");

analyseWord();

if (wt_type!=w_w_str||gettype()) return 0;

addvar(1);

settype(1,10);

wcopy();

analyseWord();

if (insource[inspos]!='(') return 0;

put_char('(');

if (!fvardescr()) return 0;

analyseWord();

if (insource[inspos]!=')') return 0;

wcopy();

analyseWord();

if (insource[inspos]!=';') return 0;

wskip();

putsrt("\n{\n");

inc_dt();

int b;

do{

b = 1;

analyseWord();

if (!scmp(&insource[inspos],"var",wlen)){

op_f_in++;

if (!fvar(0)) return 0;

}

else

if (!scmp(&insource[inspos],"begin",wlen)){

if (!fbegin(2)) return 0;

b = 0;

}

else

if (IsComment()) CommEnd();

else return 0;

} while (b==1);

clearl(0);

inspos++;

return 1;

}

int freset()

{

wskip();

if (insource[inspos]!='(') return 0;

inspos++;

analyseWord();

wskip();

if (insource[inspos]!=')') return 0;

inspos++;

if (insource[inspos]!=';') return 0;

inspos++;

return 1;

}

int fassign()

{

int t;

wskip();

if (insource[inspos]!='(') return 0;

inspos++;

analyseWord();

if(t = gettype())

{

if(t==t_t_file)

{

put_dt();

wcopy();

putsrt(" = fopen(\"");

if(insource[inspos]!=',') return 0;

inspos+=2;

while (insource[inspos]!= '\'')

{

outsource[outspos] = insource[inspos];

inspos++;

outspos++;

}

inspos++;

putsrt("\"");

putsrt(",\"w\"");

analyseWord();

if (insource[inspos]!=')') return 0;

inspos++;

putsrt(")");

if (insource[inspos]!=';') return 0;

inspos++;

putsrt(";\n");

return 1;

}

}

return 1;

}

int fread(int ln){

char s[256];

int sp;

int t;

wskip();

put_dt();

analyseWord();

if (insource[inspos]!='(') return 0;

inspos++;

analyseWord();

if(t = gettype())

{

if(t==t_t_file)

{

putsrt("fscanf(");

wcopy();

if(insource[inspos]!=',') return 0;

inspos++;

putsrt(",");

while (insource[inspos]!= ')')

{

outsource[outspos] = insource[inspos];

inspos++;

outspos++;

}

analyseWord();

if (insource[inspos]!=')') return 0;

inspos++;

putsrt(")");

if (insource[inspos]!=';') return 0;

inspos++;

putsrt(";\n");

return 1;

}

}

putsrt("scanf");

putsrt("(\"");

sp=0;

while (1) {

analyseWord();

if (wt_type!=w_w_str) return 0;

t = gettype();

if (t==t_t_int) putsrt("%d");

else return 0;

s[sp] = '&';

sp += wlen;

analyseWord();

memcpy(&s[sp],&insource[inspos],wlen);

inspos += wlen;

sp += wlen;

analyseWord();

if (insource[inspos]!=',') break;

s[sp] = insource[inspos];

inspos++;

sp++;

}

putsrt("\",");

memcpy(&outsource[outspos],s,sp);

outspos += sp;

analyseWord();

if (insource[inspos]!=')') return 0;

inspos++;

put_char(')');

analyseWord();

if (insource[inspos]!=';') return 0;

inspos++;

if (ln) putsrt("; printf(\"\\n\");\n");

else putsrt(";\n");

return 1;

}

int fae() {

analyseWord();

if (insource[inspos]=='+'){

wcopy();

}

else

if (insource[inspos]=='-'){

wcopy();

}

while (1){

analyseWord();

if (wt_type==w_w_n) wcopy(); else

if (wt_type==w_w_str&&gettype()==t_t_int) wcopy(); else

if (insource[inspos]=='('){

wcopy();

if (!fae()) return 0;

analyseWord();

if (insource[inspos]!=')') return 0;

inspos++;

put_char(')');

}

else return 0;

analyseWord();

char c = insource[inspos];

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

else return 1;

}

}

int ae(){

char c,c1;

if (!fae()) return 0;

analyseWord();

c = insource[inspos];

c1 = insource[inspos+1];

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

inspos += 2;

putsrt("!=");

}

else

if (c=='=') {

inspos++;

putsrt("==");

}

else

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

if (c1=='='){

inspos += 2;

}

else wcopy();

}

analyseWord();

if (!fae()) return 0;

return 1;

}

int fle() {

int k;

char c,c1;

int arifm, ip,op;

while (1){

analyseWord();

k = fkW();

int ip, op;

ip = inspos;

op = outspos;

arifm = 0;

if(insource[inspos]=='+'||

insource[inspos]=='('||

insource[inspos]=='-'||

wt_type==w_w_str&&!fkW() ||

wt_type==w_w_n)

arifm = ae();

if (!arifm){

inspos = ip;

outspos = op;

analyseWord();

k = fkW();

if (wt_type==w_w_str&&k==key_wrd_true){

wskip();

put_char('1');

}

else

if (wt_type==w_w_str&&k==key_wrd_false) {

wskip();

put_char('0');

}

else

if (wt_type==w_w_str&&gettype()==t_t_bool) wcopy(); else

if (insource[inspos]=='('){

wcopy();

if (!fle()) return 0;

analyseWord();

if (insource[inspos]!=')') return 0;

inspos++;

put_char(')');

}

else return 0;

}

analyseWord();

k = fkW();

if (k==key_wrd_or) putsrt("||"); else

if (k==key_wrd_and) putsrt("&&");

else return 1;

wskip();

}

}

int asign(){

int type = gettype();

if (!(type==t_t_bool||type==t_t_int)) return 0;

put_dt();

wcopy();

analyseWord();

if (insource[inspos]!=':'||insource[inspos+1]!='=')

return 0;

put_char('=');

inspos += 2;

if (type==t_t_bool) {

if (!fle()) return 0;

}

else

if (!fae()) return 0;

analyseWord();

if (insource[inspos]!=';') return 0;

wcopy();

put_char('\n');

return 1;

}

int frepeat() {

wskip();

put_dt();

putsrt("do {\n");

inc_dt();

return 1;

}

int funtil() {

wskip();

dec_dt();

put_dt();

putsrt("} while (");

if (!fle()) return 0;

put_char(')');

analyseWord();

if (insource[inspos]!=';') return 0;

inspos++;

putsrt(";\n");

return 1;

}

int fwhile() {

wskip();

put_dt();

putsrt("while (");

if (!fle()) return 0;

analyseWord();

if (wt_type!=w_w_str||fkW()!=key_wrd_do) return 0;

wskip();

putsrt(")\n");

return 1;

}

int fbegin(int globalID){

int rep_n = 0;

if(globalID!=3) wskip();

if (globalID==1) putsrt("\n\nvoid main()\n");

if ((globalID!=2)||(globalID!=3)) {

put_dt();

putsrt("{\n");

inc_dt();

}

int b;

do{

b = 1;

analyseWord();

if (IsComment()){

CommEnd();

continue;

}

switch(fkW()){

case key_wrd_begin:

op_f_in++;

if (!fbegin(0)) return 0;

op_f_out++;

break;

case key_wrd_read:

op_f_in++;

if (!fread(0)) return 0;

op_f_out++;

break;

case key_wrd_reset:

op_f_in++;

if (!freset()) return 0;

op_f_out++;

break;

case key_wrd_assign:

op_f_in++;

if (!fassign()) return 0;

op_f_out++;

break;

case key_wrd_while:

op_f_in++;

if (!fwhile()) return 0;

op_f_out++;

break;

case key_wrd_end:

op_f_in++;

if(globalID == 3) return 3;

wskip();

dec_dt();

put_dt();

putsrt("}\n");

analyseWord();

if (global0049D==1&&insource[inspos]=='.' ||

globalID!=1&&insource[inspos]==';'){

wskip();

op_f_out++;

return 1;

}

else

{

wskip();

return 0;

}

case 0:

if (!asign()) return 0;

break;

default:

return 0;

}

} while (b);

return 1;

}

int Translate()

{

int b;

int k;

op_f_in = op_f_out = 0;

putsrt("#include <stdio.h>\n\n");

do{

b = 1;

analyseWord();

k = fkW();

if (k==key_wrd_var){

op_f_in++;

if (!fvar(1)) {

ErrOp();

}

else op_f_out++; }

else

if (k==key_wrd_begin){

if (!fbegin(1)) {

ErrOp();

}

b = 0;

}

else

if (IsComment()) CommEnd();

else {

op_f_in++;

ErrOp();

};

} while (b==1);

if (insource[inspos]!='.') return 0;

inspos++;

return 1;

}

void main()

{

setlocale(LC_ALL,"Russian");

char s[128];

printf("Входной файл: ");

scanf("%s",s);

if (!frfile(s))

{

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

getch();

return;

}

vlst = NULL;

lvlst = NULL;

main_anliz();

clearl(1);

printf("\nНовый файл:");

scanf("%s",s);

if (!tofl(s))

{

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

getch();

return;

}

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

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

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

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

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

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

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

fclose(infl);

fclose(outfl);

while (!kbhit()) ;

}

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

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

var

i,k:integer;

fl:file of integer;

begin

assign(fl,'c:tuc\tuc.txt');

reset(fl);

read(fl,bla);

read(i);

i:=500;

k:=10;

while(i=k) do

begin

i:=i-k;

end;

end.

Вид экрана:

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

#include <stdio.h>

int i,k;

FILE *fl;

void main()

{

fl = fopen("c:tuc\tuc.txt","w");

fscanf(fl,bla);

scanf("%d",&i);

i=500;

k=10;

while ((i==k))

{

i=i-k;

}

}

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

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

var

i,k:integer;

fl:file of integer;

begin

assign(fl,'c:tuc\tuc.txt');

reset(fl);

read(fl,bla);

read(i);

i:=500;

k:=10;

while(i=k) do

begin

i:=i-k;

sin(30);

end;

end.

Вид экрана:

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

#include <stdio.h>

int i,k;

FILE *fl;

void main()

{

fl = fopen("c:tuc\tuc.txt","w");

fscanf(fl,bla);

scanf("%d",&i);

i=500;

k=10;

while ((i==k))

{

i=i-k;

< Ошибка! >

sin(30);

Выводы

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

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

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

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

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

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

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

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

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

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.