Разработка транслятора с языка программирования Паскаль на язык C

 

ОГЛАВЛЕНИЕ


ВВЕДЕНИЕ

. ПОСТАНОВКА ЗАДАЧИ

. АНАЛИЗ, ФОРМАЛИЗОВАННОЕ ОПИСАНИЕ ЗАДАЧИ, ВЫБОР МОДЕЛИ

.1 Понятие формальной грамматики

.1.1 Порождающие грамматики

.1.2 Аналитические грамматики

.1.3 Типы грамматик

.2 Описание задачи

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

.3 Средства приложения

. ВЫБОР ИЛИ РАЗРАБОТКА АЛГОРИТМА РЕШЕНИЯ ЗАДАЧИ

. ПРОЕКТИРОВАНИЕ ОБЩЕЙ СТРУКТУРЫ ПРОГРАММЫ

. КОДИРОВАНИЕ

. ОТЛАДКА И ВЕРИФИКАЦИЯ ПРОГРАММЫ

. ПОЛУЧЕНИЕ РЕЗУЛЬТАТА, ИНТЕРПРЕТАЦИЯ, ПОСЛЕДУЮЩАЯ МОДИФИКАЦИЯ МОДЕЛИ

. ПУБЛИКАЦИЯ ИЛИ ПЕРЕДАЧА ЗАКАЗЧИКУ РЕЗУЛЬТАТА РАБОТЫ И СОПРОВОЖДЕНИЕ ПРОГРАММЫ

ЗАКЛЮЧЕНИЕ

БИБЛИОГРАФИЧЕСКИЙ СПИСОК




ВВЕДЕНИЕ


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

Полученные представления и знания будут полезны в других случаях:

Понимание особенностей языков программирования (как самого языка, так и транслятора), нюансов выполнения написанных на них программ, вытекающих из принятых традиционных способов организации трансляторов (компиляция и интерпретация, время связывания, статические и динамические свойства).

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

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

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



1. ПОСТАНОВКА ЗАДАЧИ


В работе требуется рассмотреть такое понятие, как формальная грамматика, объяснить принципы построения грамматики. На основе построенной грамматики разработать транслятор, обрабатывающий следующие конструкции:

char

case

assign

rewrite

write

файлы

арифметические и логические выражения.

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



2. АНАЛИЗ, ФОРМАЛИЗОВАННОЕ ОПИСАНИЕ ЗАДАЧИ, ВЫБОР МОДЕЛИ


.1 Понятие формальной грамматики


Формальная грамматика или просто грамматика в теории формальных языков - способ описания формального языка, то есть выделения некоторого подмножества из множества всех слов некоторого конечного алфавита. Различают порождающие и распознающие (или аналитические) грамматики - первые задают правила, с помощью которых можно построить любое слово языка, а вторые позволяют по данному слову определить, входит оно в язык или нет.

Для более полного понимания сути вещей, введём следующие термины:

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

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


.1.1 Порождающие грамматики

Словами языка, заданного грамматикой, являются все последовательности терминалов, выводимые (порождаемые) из начального нетерминала по правилам вывода.

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

Грамматика определяется следующими характеристиками:

? - набор (алфавит) терминальных символов- набор (алфавит) нетерминальных символов- набор правил вида: «левая часть» ? «правая часть», где:

«левая часть» - непустая последовательность терминалов и нетерминалов, содержащая хотя бы один нетерминал

«правая часть» - любая последовательность терминалов и нетерминалов- стартовый (начальный) символ из набора нетерминалов.

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


.1.2 Аналитические грамматики

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


2.1.3 Типы грамматик

По иерархии Хомского, грамматики делятся на 4 типа, каждый последующий является более ограниченным подмножеством предыдущего (но и легче поддающимся анализу):

тип 0. неограниченные грамматики - возможны любые правила

тип 1. контекстно-зависимые грамматики - левая часть может содержать один нетерминал, окруженный «контекстом» (последовательности символов, в том же виде присутствующие в правой части); сам нетерминал заменяется непустой последовательностью символов в правой части.

тип 2. контекстно-свободные грамматики - левая часть состоит из одного нетерминала.

тип 3. регулярные грамматики - более простые, эквивалентны конечным автоматам.


.2 Описание задачи


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

Чтобы ясно понять принцип работы приложения, можно представить себе англо - русский словарь, где на странице в левом столбце приведены слова на английском языке, а справа даётся эквивалент на русском языке. Точно таким же образом представим синонимичные операторы языков Паскаль и С (Таблица 2.2.1):


Конструкция на ПаскалеЭквивалентная конструкция на СОператорные скобки begin…end{...}<name>:charchar <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> ofswitch(<name>){<name> : <operator >case <name>: <operator>;{ комментарий 1 } (*комментарий 2*)/*комментарий 1*/ /*комментарий 2*/……Таблица 2.2.1. - Пример синонимичных операторов языков Паскаль и С


.3 Средства реализации приложения


Приложение решено было реализовать при помощи среды Embarcadero RAD Studio 2010, а в качестве языка программирования использовать ЯВУ С++.



3. ВЫБОР ИЛИ РАЗРАБОТКА АЛГОРИТМА РЕШЕНИЯ ЗАДАЧИ


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

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

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

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

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

оптимизация

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

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

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

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

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

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



4. ПРОЕКТИРОВАНИЕ ОБЩЕЙ СТРУКТУРЫ ПРОГРАММЫ


Программа представляет собой консольное приложение, которое обрабатывает входной файл с расширением .pas (исходный код на языке Паскаль) и транслирует в выходной файл с расширением .cpp или .txt (по выбору пользователя).

Назначение подпрограмм:- главная программа, осуществляющая проход синтаксического и лексического анализатора- Подпрограмма обработки комментариев- подпрограмма обработки блока var и определяющие их типы как file или char в соответствии запускаются подпрограммы:- подпрограмма обработки файловой переменной;- подпрограмма обработки символьной переменной;- подпрограмма обрабатывающая оператор write и в зависимости от его записи запускает подпрограммы:- подпрограмма обрабатывающая write при записи в файл;- обрабатывает write как обычный вывод сообщения на экран;- подпрограмма обрабатывающая оператор rewrite;- подпрограмма обрабатывающая оператор assign(<file>,<path>) и переводящая его в <file> = fopen(<path>,w);- подпрограмма обрабатывающая оператор case. Возможно указание вложенных операторов case, операторных скобок или же их отсутствие;- подпрограмма обработки сложных case функций, может так же обрабатывать любые блоки начинающиеся с begin и заканчивающиеся ключевым словом end;- подпрограмма обрабатывающая простые конструкции case.


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


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


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


Тип словаИДОшибка0Пробел1Строка2Число3Символ4Таблица 4.3 - Таблица типов слов



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;wordLen;wordType;wordNumf;dt;struct var{s[64];tp;* next;

}varik;*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;(np->s,&pasfile[paspos],wordLen);>s[wordLen]=0;>tp = -1;(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]==','){[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)){(isGl,t_Int);_pt("int ");_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;k,svar;();{= ifKw();= k==ww_var;(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;= wivp();(t==t_Int) str_pt("%d");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");s[128];("Enter name of translation file: ");("%s",s);(!i_file(s))

{("\nERROR OF OPEN!");();;

}= NULL;= NULL;();(1);("\nEnter name of translated file:");("%s",s);(!o_file(s))

{("\nERROR OF CREATE!");();;

}("\nOoerators on Pascal:%d", pasop);("\nОperators in new file:%d", cop);("\nErrors:%d", ker);("\n\nResult:%s",s);(file1);(file2);(!kbhit()) ;

}








6. ОТЛАДКА И ВЕРИФИКАЦИЯ ПРОГРАММЫ


Для проверки работоспособности транслятора создадим какую-нибудь простую программу на языке Паскаль и сохраним её исходный код в файл с расширением .PAS, например, example.PAS (рис. 6.1).


Рисунок 6.1- Исходный текст программы на языке Паскаль


Затем запустим консольное приложение, где укажем имя нашего исходного файла (рис. 6.2).


Рисунок 6.2 - Указание имени файла для трансляции

Так как данный файл существует, ошибка не возникает, и программа предлагает дать имя выходному файлу с транслированным кодом (рис. 6.3). Назовём его «result» и сохраним как текстовый файл с расширением .txt.


Рисунок 6.3 - Указание имени выходного файла


После нажатия клавиши «Enter» на консоль выводится сообщение об успешном транслировании (количество ошибок = 0), а также информация о количестве операторов в исходном и выходном файлах и имя созданного файла (рис. 6.4).


Рисунок 6.4 - Информация о ходе выполнения трансляции

Необходимо проверить результат работы программы. В папке, где должен храниться выходной файл, был создан текстовый документ result.txt со следующим содержимым (рис. 6.5):


Рисунок 6.5 - Выходной файл с текстом програмы на языке С


Сверим правильность транслированных операторов с данными таблицы 2.2.1. В итоге можно убедиться, что текст транслирован верно.

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

Выходной файл также можно сохранить непосредственно с расширением .cpp.

Рисунок 6.6 - Ошибка открытия файла



7. ПОЛУЧЕНИЕ РЕЗУЛЬТАТА, ИНТЕРПРЕТАЦИЯ, ПОСЛЕДУЮЩАЯ МОДИФИКАЦИЯ МОДЕЛИ


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

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




8. ПУБЛИКАЦИЯ ИЛИ ПЕРЕДАЧА ЗАКАЗЧИКУ РЕЗУЛЬТАТА РАБОТЫ И СОПРОВОЖДЕНИЕ ПРОГРАММЫ


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

ЗАКЛЮЧЕНИЕ


В ходе данной курсовой работы были рассмотрены принципы построения формальных грамматик, а также разработан транслятор с языка программирования Паскаль на язык C с использованием среды Embarcadero RAD Studio 2010. Были получены представления об особенностях языков программирования, изучены механизмы лексического, синтаксического и семантического анализа, закреплены навыки программирования на ЯВУ.





БИБЛИОГРАФИЧЕСКИЙ СПИСОК

консольное приложение файл транслятор

СТО ЮУрГУ 04-2008 Стандарт организации. Курсовое и дипломное проектирование. Общие требования к содержанию и оформлению / составители: Т.И. Парубочая, Н.В. Сырейщикова, В.И. Гузеев, Л.В. Винокурова. - Челябинск: Изд-во ЮУрГУ, 2008. - 56 с..softcraft.ru/ translat/lect/content.shtml - Основы разработки трансляторов

Хопкрофт Дж. Введение в теорию автоматов, языков и вычислений/ Дж. Хопкрофт, Р. Мотвани, Дж. Ульман. - М.: Вильямс, 2002.- 528с.

Лавров С.С. Программирование. Математические основы, средства, теория/ С.С. Лавров - СПб.: БХВ - Петербург,2001. - 320с.

Шилдт, Г. Самоучитель С++, 3-е издание/ Г.Шилдт. -СПб.: БХВ - Петербург, 2003. - 687с.



ОГЛАВЛЕНИЕ ВВЕДЕНИЕ . ПОСТАНОВКА ЗАДАЧИ . АНАЛИЗ, ФОРМАЛИЗОВАННОЕ ОПИСАНИЕ ЗАДАЧИ, ВЫБОР МОДЕЛИ .1 Понятие формальной грамматики .1.1 Порожда

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

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

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

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

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