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

 

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

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

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

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









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

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


Вариант 8




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

Заболотнев В.А.

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

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

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





Ставрополь 2011

Оглавление


Введение

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

. Внешняя спецификация

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

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

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

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

Выводы

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


Введение


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


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

транслятор программа язык паскаль лексический

Заданием курсового проекта является написание транслятора, обрабатывающего следующие конструкции:

-char

-case

-assign

-rewrite

-write

-файлы

А так же арифметическое выражение (рис. 1.1) и логическое выражение (рис. 1.2)

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

Арифметическое выражение Ae2:


Рисунок 1.1 - Схема разбора арифметического выражения

Логическое выражение Le2:


Рисунок 1.2 - Схема разбора логического выражения


В качестве задания, приведем таблицу правил перевода операторов.


Таблица 1.1 - Таблица синонимичных операторов

Конструкция на ПаскалеЭквивалентная конструкция на СиОператорные скобки begin…end{...}Оператор var var <name>:<type>; <name>,<name>:<type>; label <name>;<type> <name>,<name>; <type> <name>;Тип переменной <name>:char;char <name>;Rewrite(<name>)createFile(<name>)Assign(<name>,<path>)<name> = fopen(<path>,w)Write(<file>,<text>)fprintf(<file>,text)<name> = file of <type>FILE * <name>case <name> of <name> : <operator >; <name> : <operator>; end; switch(<name>){ case <name>: <operator>; case <name>:<operator>{ комментарий 1 } (*комментарий 2*)/*комментарий 1*/ /*комментарий 2*/

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


Таблица 1.2 - Вид программы на Паскале и Си

ПаскальСиvar i,k:integer; m:char; fl:file of char; begin assign(fl,'c:tuc\tuc.txt'); rewrite(fl); Case k of 1 : Begin write('text'); End; 2 : Begin write('text1'); End; 3 : Begin write(fl,'text to file'); End; End; {End Case1} end.#include <stdio.h> int i,k; char m; FILE *fl; void main() { fl = fopen("c:tuc\tuc.txt","w"); fcreate(fl); switch(k){ case 1: { printf("text); break; case 2: { printf("text1); break; case 3: { fprintf(fl,"text to file"); break; }/*End Case1*/ }

. Внешняя спецификация


На вход программы будет поступать входной файл. При этом на экран будет выведено сообщение:

Пожалуйста, укажите файл для трансляции:

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

Пожалуйста, введите имя для транслята:

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

Программа будет не требовательна к аппаратному обеспечению. Компьютер оснащенный 500 Гц процессором и оперативной памятью более 32 Мб подойдет.


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


Практически во всех трансляторах (и в компиляторах, и в интерпретаторах) в том или ином виде присутствует большая часть перечисленных ниже процессов:

·лексический анализ

·синтаксический анализ

·семантический анализ

·генерация внутреннего представления программы

·оптимизация

·генерация объектной программы.

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

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

Поэтому наиболее разумным будет построение однопроходного транслятора. Лексический анализатор читает фрагмент исходного текста, необходимый для получения одной лексемы. После формирования лексемы им осуществляется вызов синтаксического анализатора и передача ему созданной лексемы в качестве параметра. Если синтаксический анализатор может построить очередной элемент промежуточного представления, то он делает это и передает построенный фрагмент генератору кода. В противном случае синтаксический анализатор возвращает управление сканеру, давая, тем самым, понять, что очередная лексема обработана и нужны новые данные.

Генератор кода функционирует аналогичным образом. По полученному фрагменту промежуточного представления он создает соответствующий фрагмент объектного кода. После этого управление возвращается синтаксическому анализатору.

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


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



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

Main - главная программа, осуществляющая проход синтаксического и лексического анализатора

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

Var - подпрограмма обработки блока var и определяющие их типы как file или char в соответствии запускаются подпрограммы:

File - подпрограмма обработки файловой переменной

char - подпрограмма обработки символьной переменной

Write - подпрограмма обрабатывающая оператор write и в зависимости от его записи запускает подпрограммы:

toFile - подпрограмма обрабатывающая write при записи в файл

toScreen - обрабатывает write как обычный вывод сообщения на экран

rewrite - подпрограмма обрабатывающая оператор rewrite- подпрограмма обрабатывающая оператор assign(<file>,<path>) и переводящая его в <file> = fopen(<path>,w)

case - подпрограмма обрабатывающая оператор case. Возможно указание вложенных операторов case, операторных скобок или же их отсутствие.

begin - подпрограмма обработки сложных case функций, может так же обрабатывать любые блоки начинающиеся с begin и заканчивающиеся ключевым словом end- подпрограмма обрабатывающая простые конструкции case

Таблицы идентификаций:


Таблица 1.3 - Таблица ключевых слов

Оператор или ключевое словоНомерbegin1end2var3Char4boolean5False6true7and8or9case10assign11write12rewrite13

Таблица 1.4 - Таблица типов переменных

ТипИдентификационный номерЦелочисленный1Символьный2Логический3Файл4

Таблица 1.5 - Таблица типов слов

Тип словаИдентификационный номерОшибка0Пробел1Строка2Число3Символ4

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


#include <conio.h>

#include <stdio.h>

#include <string.h>

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

{

"begin", "end", "var", "char",

"boolean", "false", "true", "and",

"or", "case", "assign", "write",

"rewrite"

};

#define ww_begin 1

#define ww_end 2

#define ww_var 3

#define ww_char 4

#define ww_boolean 5

#define ww_false 6

#define ww_true 7

#define ww_and 8

#define ww_or 9

#define ww_case 10

#define ww_assign 11

#define ww_write 12

#define ww_rewrite 13

#define t_Int 1

#define t_char 2

#define t_Bool 3

#define t_File 5

#define w_error 0

#define w_space 1

#define w_str 2

#define w_numb 3

#define w_char 4pasfile[maxLen],[maxLen];inlen,outlen,paspos;pasop,cop,ker;

int wordLen;wordType;wordNumf;

int dt;struct var{s[64];tp;* next;

};*vars, *lvars;fle();addvar(int isGl){*np, *p;(isGl) p = vars; else p = lvars;(p) {(strlen(p->s)==wordLen&&

!memcmp(p->s,&pasfile[paspos],wordLen)) return 0;= p->next;

}= new var;

memcpy(np->s,&pasfile[paspos],wordLen);>s[wordLen]=0;>tp = -1;

if (isGl) {>next = vars;= np;

} else {>next = lvars;= np;

}1;

}sttov(int isGl, int type){*p;(isGl) p = vars; else p = lvars;(p) {(p->tp==-1) p->tp = type;= p->next;

}

}wivp(){* p;= lvars;(p) {(strlen(p->s)==wordLen&&

!memcmp(p->s,&pasfile[paspos],wordLen)) return p->tp;= p->next;

}= vars;(p) {(strlen(p->s)==wordLen&&

!memcmp(p->s,&pasfile[paspos],wordLen)) return p->tp;= p->next;

}0;

}freevars(int isGl){*p, *pp;= lvars;(p) {= p;= p->next;pp;

}= NULL;(isGl) {= vars;(p) {= p;= p->next;pp;

}= NULL;

}

}takeLex()

{st = 0;c;= 0;(wordLen+paspos<inlen){= pasfile[paspos+wordLen];(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<='/' ||=='\''

)

{ wordLen = 1; return wordType = w_char; }{ wordLen = 0; return wordType = w_error; };1:(c==' ' || c=='\t' || c=='\n') wordLen++;return wordType = w_space;;2:(

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

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

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

) wordLen++;return wordType = w_str;;3:(c>='0' && c<='9') wordLen++; else(c=='.'&& pasfile[paspos+wordLen+1]!='.') {++;= 5;

}{= 0;wordType = w_numb;

};5:(c>='0' && c<='9') wordLen++; else {= 1;wordType = w_numb;

}

}

}= 0;0;

}str_pt(char * s){l = strlen(s);(&cfile[outlen],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){[outlen] = c;++;

}trCpy(){(&cfile[outlen],&pasfile[paspos],wordLen);+= wordLen;+= wordLen;

}trEqu(char * s){(!scmp(&pasfile[paspos],s,wordLen));

}wr_skip(){+= wordLen;

}wstr(char * s){(s,&pasfile[paspos],wordLen);

}IsWrd(){();(wordType==w_space) {_skip();();

}wordType;

}inc_dt()

{+= 2;

}dt_pl()

{-= 2;

}dt_pt()

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

}put_dt11()

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

}

}i_file(char * s1)

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

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

}o_file(char * s2)

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

}(cfile,outlen,1,file2);1;

}op_err()

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

};();

}++;

}f_commen(){(pasfile[paspos]=='{' ||[paspos]=='(' ||pasfile[paspos+1]=='*');

}f_endcommen(){(pasfile[paspos]=='{'){[outlen] = '/';[outlen+1] = '*';++;+= 2;(pasfile[paspos]!='}' && paspos<inlen) {(paspos>=inlen) return;[outlen] = pasfile[paspos];++;++;

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

}{[outlen] = '/';[outlen+1] = '*';+= 2;+= 2;(!(pasfile[paspos]=='*' && pasfile[paspos+1]==')')

&& paspos<inlen) {(paspos>=inlen) return;[outlen] = pasfile[paspos];++;++;

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

}_char('\n');

}ifKw(){(int i=0; i<KWn; i++){(!scmp(&pasfile[paspos],KWs[i],wordLen))i+1;

}0;

}varOpT(int svar, int isGl){s[256];label;sp = 0;();(1){(wordType!=w_str||ifKw()|| isGl>0&&wivp()) return 0;(isGl);(svar) {[sp] = '&';[sp+1] = ' ';+= 2;

}(&s[sp],&pasfile[paspos],wordLen);+= wordLen;+= wordLen;();(pasfile[paspos]==','){

s[sp]=',';++;

sp++;

} else break;();

}(pasfile[paspos]==':'){++;();(wordType!=w_str) return 0;(!scmp(&pasfile[paspos],"boolean",wordLen)){(isGl,t_Bool);_pt("int ");_skip();(&cfile[outlen],&s[0],sp);+= sp;

}(!scmp(&pasfile[paspos],"char",wordLen)){(isGl,t_char);_pt("char ");_skip();(&cfile[outlen],&s[0],sp);+= sp;

}(!scmp(&pasfile[paspos],"integer",wordLen)){

sttov(isGl,t_Int);_pt("int ");

wr_skip();(&cfile[outlen],&s[0],sp);+= sp;

}(trEqu("file"))

{_skip();();(!trEqu("of")) return 0;_skip();();_pt("FILE *");(&cfile[outlen],&s[0],sp);+= sp;_skip();(isGl,t_File);

}

}return 0;1;

}fvarBlk(int isGl){+= wordLen;();{++;(f_commen()){_endcommen();++;;

}_pt();(!varOpT(0,isGl)) op_err();cop++;();(pasfile[paspos]!=';')0;_skip();_pt(";\n");();(wordType!=w_str || ifKw())1;

}while(1);

}isVarBlk(){+= wordLen;

int k,svar;();{= ifKw();= k==ww_var;

if (svar) {_skip();();

}(!varOpT(svar,0)) return 0;();(pasfile[paspos]!=';') return 1;_skip();_pt(", ");();= ifKw();(wordType!=w_str || k&&k!=ww_var) return 0;

}while(1);

}mainScope(int k);fgoto()

{_skip();_pt();_pt("goto ");();();(pasfile[paspos]!=';') return 0;_pt(";\n");++;1;

}fcase()

{beg;_skip();_pt();_pt("switch");_pt("(");();();_pt("){\n");();(!trEqu("of")) return 0;_skip();(1)

{();(trEqu("end")) {_skip();++;_pl();_pt();_pt("}\n");;

}_pt();_pt("case ");((wordType!=w_str)&&(wordType!=w_numb)&&(wordType!=w_char)) return 0;(pasfile[paspos]=='\'') {wr_skip(); str_pt("\'");}();();(pasfile[paspos]=='\'') {wr_skip(); str_pt("\'");}();(pasfile[paspos]!=':') return 0;();();= 0;(trEqu("begin")) {wr_skip(); beg = 1;};_pt("\n");_dt();(3);_pl();(trEqu("end")&&beg)

{_pt();_pt("break;\n");_skip();(pasfile[paspos]==';') paspos++;

} else { dt_pt(); str_pt("break;\n");}

}1;

}frewrite()

{_skip();(pasfile[paspos]!='(') return 0;++;_pt();_pt("fcreate(");();(wivp()!=t_File) return 0;();(pasfile[paspos]!=')') return 0;++;_pt(")");(pasfile[paspos]!=';') return 0;++;_pt(";\n");1;

}fassign()

{t;_skip();(pasfile[paspos]!='(') return 0;++;();(t = wivp())

{(t==t_File)

{_pt();();_pt(" = fopen(");(pasfile[paspos]!=',') return 0;+=2;(pasfile[paspos]!= '\'')

{[outlen] = pasfile[paspos];++;++;

}++;_pt("");_pt(",w");();(pasfile[paspos]!=')') return 0;++;_pt(")");(pasfile[paspos]!=';') return 0;++;_pt(";\n");1;

}

}1;

}fwrite(int ln){s[256];sp;t;_skip();_pt();();(pasfile[paspos]!='(') return 0;++;

/* Обработка файла */();(t = wivp())

{(t==t_File)

{_pt("fprintf(");();(pasfile[paspos]!=',') return 0;+=2;_pt(",");(pasfile[paspos]!= '\'')

{[outlen] = pasfile[paspos];++;++;

}++;_pt("");();(pasfile[paspos]!=')') return 0;++;_pt(")");(pasfile[paspos]!=';') return 0;++;_pt(";\n");1;

}

}_pt("printf");_char('(');();(pasfile[paspos]!='\'') return 0;_char('"');++;(pasfile[paspos]!= '\'') {[outlen] = pasfile[paspos];++;++;

}++;(pasfile[paspos]==')')

{(ln) str_pt("\\n");_char(')');++;(pasfile[paspos]!=';') return 0;++;_pt(";\n");1;

}(pasfile[paspos]!=',') return 0;++;=0;(1) {();(wordType!=w_str) return 0;

t = wivp();(t==t_Int) str_pt("%d");

else if (t==t_char) str_pt("%f");return 0;(&s[sp],&pasfile[paspos],wordLen);+= wordLen;+= wordLen;();(pasfile[paspos]!=',') break;[sp] = pasfile[paspos];++;++;

}(ln) str_pt("\\n");_char('"');();_pt("\,");(&cfile[outlen],s,sp);+= sp;();(pasfile[paspos]!=')') return 0;++;_char(')');();(pasfile[paspos]!=';') return 0;++;_pt(";\n");1;

}fae() {();(pasfile[paspos]=='+'){();

}(pasfile[paspos]=='-'){();

}(1){();(wordType==w_numb) trCpy(); else(wordType==w_str&&wivp()==t_Int) trCpy(); else(wordType==w_str&&wivp()==t_char) trCpy(); else(pasfile[paspos]=='('){();(!fae()) return 0;();(pasfile[paspos]!=')') return 0;++;_char(')');

}return 0;();c = pasfile[paspos];(c=='+'||c=='-'||c=='*'||c=='/') trCpy();return 1;

}

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

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

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

}trCpy();

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

}fle() {k;c,c1;arifm, ip,op;(1){();= ifKw();ip, op;= paspos;= outlen;= 0;(pasfile[paspos]=='+'||[paspos]=='('||[paspos]=='-'||==w_str&&!ifKw() ||==w_numb)= ae();(!arifm){= ip;= op;();= ifKw();(wordType==w_str&&k==ww_true){_skip();_char('1');

}(wordType==w_str&&k==ww_false) {_skip();_char('0');

}(wordType==w_str&&wivp()==t_Bool) trCpy(); else(pasfile[paspos]=='('){();(!fle()) return 0;();(pasfile[paspos]!=')') return 0;++;_char(')');

}return 0;

}();= ifKw();(k==ww_or) str_pt("||"); else(k==ww_and) str_pt("&&");return 1;_skip();

}

}asign(){type = wivp();(!(type==t_Bool||type==t_char||type==t_Int)) return 0;_pt();();();(pasfile[paspos]!=':'||pasfile[paspos+1]!='=')0;_char('=');+= 2;(type==t_Bool) {(!fle()) return 0;

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

}mainScope(int isGl){rep_n = 0;(isGl!=3) wr_skip();(isGl==1) str_pt("\n\nvoid main()\n");((isGl!=2)||(isGl!=3)) {_pt();_pt("{\n");_dt();

}b;{= 1;();(f_commen()){_endcommen();;

}(ifKw()){ww_begin:++;(!mainScope(0)) return 0;++;;ww_case:++;(!fcase()) return 0;;ww_write:++;(!fwrite(0)) return 0;++;;ww_rewrite:++;(!frewrite()) return 0;++;;ww_assign:++;(!fassign()) return 0;++;;ww_end:++;(isGl == 3) return 3;_skip();_pl();_pt();_pt("}\n");();(isGl==1&&pasfile[paspos]=='.' ||!=1&&pasfile[paspos]==';'){_skip();++;1;

}

{_skip();0;

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

}

} while (b);1;

}Translate()

{b;k;= cop = 0;_pt("#include <stdio.h>\n\n");{= 1;();= ifKw();(k==ww_var){++;(!fvarBlk(1)) {_err();

}cop++; }(k==ww_begin){(!mainScope(1)) {_err();

}= 0;

}(f_commen()) f_endcommen();{++;_err();

};

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

}main()

{(LC_ALL,"Russian");

char s[128];("Пожалуйста, укажите файл для трансляции: ");

scanf("%s",s);(!i_file(s))

{("\nОшибка открытия файла!");();;

}= NULL;= NULL;();(1);("\nПожалуйста, введите имя для транслята:");

scanf("%s",s);(!o_file(s))

{("\nОшибка создания файла!");();

return;

}("\nОператоров в файле на паскале:%d", pasop);("\nОператоров в новом файле:%d", cop);

printf("\nОшибок:%d", ker);("\n\nРезультат:%s",s);(file1);(file2);(!kbhit()) ;

}


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


Входной файл 8.pas:,k:integer;:char;:file of char;(fl,'c:tuc\tuc.txt');(fl);k of

: Begin('text');;

: Begin('text1');;

: Begin(fl,'text to file');;; {End Case1}.

Вид экрана:



Транслят:

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

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

{("text);;2:

{("text1);;3:

{(fl,"text to file");

break;

} /*End Case1*/

}

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



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

var,k:integer;:char;:file of char;(fl,'c:tuc\tuc.txt');(fl);k of

: Begin('text');;

: Begin('text1');;

: Begin(fl,'text to file');;; {End Case1}(x);

end.

Вид экрана:


Транслят:

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

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

{("text);;2:

{("text1);;3:

{(fl,"text to file");;

}

/*End Case1*/

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


Выводы


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


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


1.А.Б., К. Изучаем C++. - Санкт-Петербург: Питер, 2004.

2.Либерти Д. Освой самостоятельно C++ за 21 день. - Москва: Вильямс, 2007.

.Саммер Г. Новые сложные задачи на C++. - Москва: Вильямс, 2005.


Министерство образования и науки Российской Федерации Федеральное агентство по образованию Государственное образовательное учреждение высшего профессионал

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ