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

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

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

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

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

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

ОГЛАВЛЕНИЕ

ВВЕДЕНИЕ

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

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

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

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

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

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

2.2 Описание задачи

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

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

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

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

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

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

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

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

ЗАКЛЮЧЕНИЕ

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

ВВЕДЕНИЕ

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

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

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

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

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

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

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

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

-char

- case

- assign

- rewrite

- write

- файлы

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

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

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

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

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

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

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

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

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

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

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

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

? - набор (алфавит) терминальных символов

N - набор (алфавит) нетерминальных символов

P - набор правил вида: «левая часть» > «правая часть», где:

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

«правая часть» -- любая последовательность терминалов и нетерминалов

S -- стартовый (начальный) символ из набора нетерминалов.

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

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

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

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

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

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

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

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

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

2.2 Описание задачи

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

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

Конструкция на Паскале

Эквивалентная конструкция на С

Операторные скобки begin…end

{...}

<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

switch(<name>){

<name> : <operator >

case <name>: <operator>;

{ комментарий 1 } (*комментарий 2*)

/*комментарий 1*/ /*комментарий 2*/

Таблица 2.2.1. - Пример синонимичных операторов языков Паскаль и С

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

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

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

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

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

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

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

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

оптимизация

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

rewrite - подпрограмма обрабатывающая оператор rewrite;

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

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

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

simple - подпрограмма обрабатывающая простые конструкции case.

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

begin

1

and

8

end

2

or

9

var

3

case

10

char

4

assign

11

boolean

5

write

12

false

6

rewrite

13

true

7

Таблица 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>

FILE *file1, *file2;

const int maxLen = 10000;

const int KWn = 13;

char * 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 4

char pasfile[maxLen],

cfile[maxLen];

int inlen,outlen,paspos;

int pasop,cop,ker;

int wordLen;

int wordType;

int wordNumf;

int dt;

typedef struct var{

char s[64];

int tp;

var * next;

}varik;

var *vars, *lvars;

int fle();

int addvar(int isGl){

var *np, *p;

if (isGl) p = vars; else p = lvars;

while (p) {

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

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

p = p->next;

}

np = new var;

memcpy(np->s,&pasfile[paspos],wordLen);

np->s[wordLen]=0;

np->tp = -1;

if (isGl) {

np->next = vars;

vars = np;

} else {

np->next = lvars;

lvars = np;

}

return 1;

}

void sttov(int isGl, int type){

var *p;

if (isGl) p = vars; else p = lvars;

while (p) {

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

p = p->next;

}

}

int wivp(){

var * p;

p = lvars;

while (p) {

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

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

p = p->next;

}

p = vars;

while (p) {

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

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

p = p->next;

}

return 0;

}

void freevars(int isGl){

var *p, *pp;

p = lvars;

while (p) {

pp = p;

p = p->next;

delete pp;

}

lvars = NULL;

if (isGl) {

p = vars;

while (p) {

pp = p;

p = p->next;

delete pp;

}

vars = NULL;

}

}

int takeLex()

{

int st = 0;

char c;

wordLen = 0;

while (wordLen+paspos<inlen){

c = pasfile[paspos+wordLen];

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

)

{ wordLen = 1; return wordType = w_char; }

else { wordLen = 0; return wordType = w_error; }

break;

case 1:

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

else return wordType = w_space;

break;

case 2:

if (

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

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

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

c=='_'

) wordLen++;

else return wordType = w_str;

break;

case 3:

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

if (c=='.'&& pasfile[paspos+wordLen+1]!='.') {

wordLen++;

st = 5;

}

else{

wordNumf = 0;

return wordType = w_numb;

}

break;

case 5:

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

wordNumf = 1;

return wordType = w_numb;

}

}

}

wordLen = 0;

return 0;

}

void str_pt(char * s){

int l = strlen(s);

memcpy(&cfile[outlen],s,l);

outlen += 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){

cfile[outlen] = c;

outlen++;

}

void trCpy(){

memcpy(&cfile[outlen],&pasfile[paspos],wordLen);

paspos += wordLen;

outlen += wordLen;

}

int trEqu(char * s){

return (!scmp(&pasfile[paspos],s,wordLen));

}

void wr_skip(){

paspos += wordLen;

}

void wstr(char * s){

strncpy(s,&pasfile[paspos],wordLen);

}

int IsWrd(){

takeLex();

if (wordType==w_space) {

wr_skip();

takeLex();

}

return wordType;

}

void inc_dt()

{

dt += 2;

}

void dt_pl()

{

dt -= 2;

}

void dt_pt()

{

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);

str_pt(s);

}

}

int i_file(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>maxLen) inlen = maxLen;

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

pasfile[inlen] = 0;

paspos = 0;

outlen = 0;

return 1;

}

int o_file(char * s2)

{

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

return 0;

}

fwrite(cfile,outlen,1,file2);

return 1;

}

void op_err()

{

put_char('\n');

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

int k;

while (1){

IsWrd();

if (pasfile[paspos]== ';' || paspos>= inlen) {

trCpy();

break;

};

trCpy();

}

ker++;

}

int f_commen(){

return (pasfile[paspos]=='{' ||

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

}

void f_endcommen(){

if (pasfile[paspos]=='{'){

cfile[outlen] = '/';

cfile[outlen+1] = '*';

paspos++;

outlen += 2;

while (pasfile[paspos]!='}' && paspos<inlen) {

if (paspos>=inlen) return;

cfile[outlen] = pasfile[paspos];

paspos++;

outlen++;

}

cfile[outlen] = '*';

cfile[outlen+1] = '/';

paspos++;

outlen += 2;

}

else{

cfile[outlen] = '/';

cfile[outlen+1] = '*';

paspos += 2;

outlen += 2;

while (!(pasfile[paspos]=='*' && pasfile[paspos+1]==')')

&& paspos<inlen) {

if (paspos>=inlen) return;

cfile[outlen] = pasfile[paspos];

paspos++;

outlen++;

}

cfile[outlen] = '*';

cfile[outlen+1] = '/';

paspos += 2;

outlen += 2;

}

put_char('\n');

}

int ifKw(){

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

if (!scmp(&pasfile[paspos],KWs[i],wordLen))

return i+1;

}

return 0;

}

int varOpT(int svar, int isGl){

char s[256];

int label;

int sp = 0;

IsWrd();

while (1){

if (wordType!=w_str||ifKw()|| isGl>0&&wivp()) return 0;

addvar(isGl);

if (svar) {

s[sp] = '&';

s[sp+1] = ' ';

sp += 2;

}

memcpy(&s[sp],&pasfile[paspos],wordLen);

paspos += wordLen;

sp += wordLen;

IsWrd();

if (pasfile[paspos]==','){

s[sp]=',';

paspos++;

sp++;

} else break;

IsWrd();

}

if (pasfile[paspos]==':'){

paspos++;

IsWrd();

if (wordType!=w_str) return 0;

if (!scmp(&pasfile[paspos],"boolean",wordLen)){

sttov(isGl,t_Bool);

str_pt("int ");

wr_skip();

memcpy(&cfile[outlen],&s[0],sp);

outlen += sp;

}

else

if (!scmp(&pasfile[paspos],"char",wordLen)){

sttov(isGl,t_char);

str_pt("char ");

wr_skip();

memcpy(&cfile[outlen],&s[0],sp);

outlen += sp;

}

else

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

sttov(isGl,t_Int);

str_pt("int ");

wr_skip();

memcpy(&cfile[outlen],&s[0],sp);

outlen += sp;

}

else

if(trEqu("file"))

{

wr_skip();

IsWrd();

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

wr_skip();

IsWrd();

str_pt("FILE *");

memcpy(&cfile[outlen],&s[0],sp);

outlen += sp;

wr_skip();

sttov(isGl,t_File);

}

}

else return 0;

return 1;

}

int fvarBlk(int isGl){

paspos += wordLen;

IsWrd();

do{

pasop++;

if (f_commen()){

f_endcommen();

cop++;

continue;

}

dt_pt();

if (!varOpT(0,isGl)) op_err();

else cop++;

IsWrd();

if (pasfile[paspos]!=';')

return 0;

wr_skip();

str_pt(";\n");

IsWrd();

if (wordType!=w_str || ifKw())

return 1;

}while(1);

}

int isVarBlk(){

paspos += wordLen;

int k,svar;

IsWrd();

do{

k = ifKw();

svar = k==ww_var;

if (svar) {

wr_skip();

IsWrd();

}

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

IsWrd();

if (pasfile[paspos]!=';') return 1;

wr_skip();

str_pt(", ");

IsWrd();

k= ifKw();

if (wordType!=w_str || k&&k!=ww_var) return 0;

}while(1);

}

int mainScope(int k);

int fgoto()

{

wr_skip();

dt_pt();

str_pt("goto ");

IsWrd();

trCpy();

if (pasfile[paspos]!=';') return 0;

str_pt(";\n");

paspos++;

return 1;

}

int fcase()

{

int beg;

wr_skip();

dt_pt();

str_pt("switch");

str_pt("(");

IsWrd();

trCpy();

str_pt("){\n");

IsWrd();

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

wr_skip();

while(1)

{

IsWrd();

if (trEqu("end")) {

wr_skip();

paspos++;

dt_pl();

dt_pt();

str_pt("}\n");

break;

}

dt_pt();

str_pt("case ");

if ((wordType!=w_str)&&(wordType!=w_numb)&&(wordType!=w_char)) return 0;

if (pasfile[paspos]=='\'') {wr_skip(); str_pt("\'");}

IsWrd();

trCpy();

if (pasfile[paspos]=='\'') {wr_skip(); str_pt("\'");}

IsWrd();

if (pasfile[paspos]!=':') return 0;

trCpy();

IsWrd();

beg = 0;

if (trEqu("begin")) {wr_skip(); beg = 1;};

str_pt("\n");

inc_dt();

mainScope(3);

dt_pl();

if (trEqu("end")&&beg)

{

dt_pt();

str_pt("break;\n");

wr_skip();

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

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

}

return 1;

}

int frewrite()

{

wr_skip();

if (pasfile[paspos]!='(') return 0;

paspos++;

dt_pt();

str_pt("fcreate(");

IsWrd();

if(wivp()!=t_File) return 0;

trCpy();

if (pasfile[paspos]!=')') return 0;

paspos++;

str_pt(")");

if (pasfile[paspos]!=';') return 0;

paspos++;

str_pt(";\n");

return 1;

}

int fassign()

{

int t;

wr_skip();

if (pasfile[paspos]!='(') return 0;

paspos++;

IsWrd();

if(t = wivp())

{

if(t==t_File)

{

dt_pt();

trCpy();

str_pt(" = fopen(\"");

if(pasfile[paspos]!=',') return 0;

paspos+=2;

while (pasfile[paspos]!= '\'')

{

cfile[outlen] = pasfile[paspos];

paspos++;

outlen++;

}

paspos++;

str_pt("\"");

str_pt(",\"w\"");

IsWrd();

if (pasfile[paspos]!=')') return 0;

paspos++;

str_pt(")");

if (pasfile[paspos]!=';') return 0;

paspos++;

str_pt(";\n");

return 1;

}

}

return 1;

}

int fwrite(int ln){

char s[256];

int sp;

int t;

wr_skip();

dt_pt();

IsWrd();

if (pasfile[paspos]!='(') return 0;

paspos++;

/* Обработка файла */

IsWrd();

if(t = wivp())

{

if(t==t_File)

{

str_pt("fprintf(");

trCpy();

if(pasfile[paspos]!=',') return 0;

paspos+=2;

str_pt(",\"");

while (pasfile[paspos]!= '\'')

{

cfile[outlen] = pasfile[paspos];

paspos++;

outlen++;

}

paspos++;

str_pt("\"");

IsWrd();

if (pasfile[paspos]!=')') return 0;

paspos++;

str_pt(")");

if (pasfile[paspos]!=';') return 0;

paspos++;

str_pt(";\n");

return 1;

}

}

str_pt("printf");

put_char('(');

IsWrd();

if (pasfile[paspos]!='\'') return 0;

put_char('"');

paspos++;

while (pasfile[paspos]!= '\'') {

cfile[outlen] = pasfile[paspos];

paspos++;

outlen++;

}

paspos++;

if (pasfile[paspos]==')')

{

if (ln) str_pt("\\n");

put_char(')');

paspos++;

if (pasfile[paspos]!=';') return 0;

paspos++;

str_pt(";\n");

return 1;

}

if (pasfile[paspos]!=',') return 0;

paspos++;

sp=0;

while (1) {

IsWrd();

if (wordType!=w_str) return 0;

t = wivp();

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

else if (t==t_char) str_pt("%f");

else return 0;

memcpy(&s[sp],&pasfile[paspos],wordLen);

paspos += wordLen;

sp += wordLen;

IsWrd();

if (pasfile[paspos]!=',') break;

s[sp] = pasfile[paspos];

paspos++;

sp++;

}

if (ln) str_pt("\\n");

put_char('"');

IsWrd();

str_pt("\,");

memcpy(&cfile[outlen],s,sp);

outlen += sp;

IsWrd();

if (pasfile[paspos]!=')') return 0;

paspos++;

put_char(')');

IsWrd();

if (pasfile[paspos]!=';') return 0;

paspos++;

str_pt(";\n");

return 1;

}

int fae() {

IsWrd();

if (pasfile[paspos]=='+'){

trCpy();

}

else

if (pasfile[paspos]=='-'){

trCpy();

}

while (1){

IsWrd();

if (wordType==w_numb) trCpy(); else

if (wordType==w_str&&wivp()==t_Int) trCpy(); else

if (wordType==w_str&&wivp()==t_char) trCpy(); else

if (pasfile[paspos]=='('){

trCpy();

if (!fae()) return 0;

IsWrd();

if (pasfile[paspos]!=')') return 0;

paspos++;

put_char(')');

}

else return 0;

IsWrd();

char c = pasfile[paspos];

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

else return 1;

}

}

int ae(){

char c,c1;

if (!fae()) return 0;

IsWrd();

c = pasfile[paspos];

c1 = pasfile[paspos+1];

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

paspos += 2;

str_pt("!=");

}

else

if (c=='=') {

paspos++;

str_pt("==");

}

else

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

if (c1=='='){

paspos += 2;

}

else trCpy();

}

IsWrd();

if (!fae()) return 0;

return 1;

}

int fle() {

int k;

char c,c1;

int arifm, ip,op;

while (1){

IsWrd();

k = ifKw();

int ip, op;

ip = paspos;

op = outlen;

arifm = 0;

if(pasfile[paspos]=='+'||

pasfile[paspos]=='('||

pasfile[paspos]=='-'||

wordType==w_str&&!ifKw() ||

wordType==w_numb)

arifm = ae();

if (!arifm){

paspos = ip;

outlen = op;

IsWrd();

k = ifKw();

if (wordType==w_str&&k==ww_true){

wr_skip();

put_char('1');

}

else

if (wordType==w_str&&k==ww_false) {

wr_skip();

put_char('0');

}

else

if (wordType==w_str&&wivp()==t_Bool) trCpy(); else

if (pasfile[paspos]=='('){

trCpy();

if (!fle()) return 0;

IsWrd();

if (pasfile[paspos]!=')') return 0;

paspos++;

put_char(')');

}

else return 0;

}

IsWrd();

k = ifKw();

if (k==ww_or) str_pt("||"); else

if (k==ww_and) str_pt("&&");

else return 1;

wr_skip();

}

}

int asign(){

int type = wivp();

if (!(type==t_Bool||type==t_char||type==t_Int)) return 0;

dt_pt();

trCpy();

IsWrd();

if (pasfile[paspos]!=':'||pasfile[paspos+1]!='=')

return 0;

put_char('=');

paspos += 2;

if (type==t_Bool) {

if (!fle()) return 0;

}

else

if (!fae()) return 0;

IsWrd();

if (pasfile[paspos]!=';') return 0;

trCpy();

put_char('\n');

return 1;

}

int mainScope(int isGl){

int rep_n = 0;

if(isGl!=3) wr_skip();

if (isGl==1) str_pt("\n\nvoid main()\n");

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

dt_pt();

str_pt("{\n");

inc_dt();

}

int b;

do{

b = 1;

IsWrd();

if (f_commen()){

f_endcommen();

continue;

}

switch(ifKw()){

case ww_begin:

pasop++;

if (!mainScope(0)) return 0;

cop++;

break;

case ww_case:

pasop++;

if (!fcase()) return 0;

break;

case ww_write:

pasop++;

if (!fwrite(0)) return 0;

cop++;

break;

case ww_rewrite:

pasop++;

if (!frewrite()) return 0;

cop++;

break;

case ww_assign:

pasop++;

if (!fassign()) return 0;

cop++;

break;

case ww_end:

pasop++;

if(isGl == 3) return 3;

wr_skip();

dt_pl();

dt_pt();

str_pt("}\n");

IsWrd();

if (isGl==1&&pasfile[paspos]=='.' ||

isGl!=1&&pasfile[paspos]==';'){

wr_skip();

cop++;

return 1;

}

else

{

wr_skip();

return 0;

}

case 0:

if (!asign()) return 0;

break;

default:

return 0;

}

} while (b);

return 1;

}

int Translate()

{

int b;

int k;

pasop = cop = 0;

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

do{

b = 1;

IsWrd();

k = ifKw();

if (k==ww_var){

pasop++;

if (!fvarBlk(1)) {

op_err();

}

else cop++; }

else

if (k==ww_begin){

if (!mainScope(1)) {

op_err();

}

b = 0;

}

else

if (f_commen()) f_endcommen();

else {

pasop++;

op_err();

};

} while (b==1);

if (pasfile[paspos]!='.') return 0;

paspos++;

return 1;

}

void main()

{

setlocale(LC_ALL,"Russian");

char s[128];

printf("Enter name of translation file: ");

scanf("%s",s);

if (!i_file(s))

{

printf("\nERROR OF OPEN!");

getch();

return;

}

vars = NULL;

lvars = NULL;

Translate();

freevars(1);

printf("\nEnter name of translated file:");

scanf("%s",s);

if (!o_file(s))

{

printf("\nERROR OF CREATE!");

getch();

return;

}

printf("\nOoerators on Pascal:%d", pasop);

printf("\nОperators in new file:%d", cop);

printf("\nErrors:%d", ker);

printf("\n\nResult:%s",s);

fclose(file1);

fclose(file2);

while (!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 с.

www.softcraft.ru/ translat/lect/content.shtml - Основы разработки трансляторов

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

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

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

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


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

  • Общая характеристика языков программирования. Описание языка Паскаль: основные субъекты языка; структура Паскаль-программы; типизация и объявление данных. Операторы присваивания и выражения. Структурные операторы, организация ветвлений и циклов.

    дипломная работа [276,6 K], добавлен 26.01.2011

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

    курсовая работа [290,9 K], добавлен 05.12.2008

  • Разработка программы для решения системы обыкновенных дифференциальных уравнений на базе языка программирования Паскаль АВС. Чтение исходных данных из внешнего файла. Вывод исходных данных и результатов на дисплей и во внешний файл. Суть метода Ейлера.

    реферат [126,1 K], добавлен 12.01.2012

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

    курсовая работа [1,0 M], добавлен 03.07.2011

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

    курсовая работа [305,9 K], добавлен 03.07.2011

  • Язык программирования как набор лексических и синтаксических правил, задающих внешний вид программы. Двоичное представления команд в универсальных программах и применение Ассамблера для создания макросов и меток. Разработка языков Фортран, Паскаль и Си.

    презентация [828,5 K], добавлен 10.05.2011

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

    курсовая работа [59,2 K], добавлен 09.04.2012

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

    курсовая работа [254,0 K], добавлен 02.07.2011

  • Особенности способов описания языков программирования. Язык программирования как способ записи программ на ЭВМ в понятной для компьютера форме. Характеристика языка Паскаль, анализ стандартных его функций. Анализ примеров записи арифметических выражений.

    курсовая работа [292,0 K], добавлен 18.03.2013

  • Рассмотрение общих сведений и уровней языков программирования. Ознакомление с историей развития, использования языков программирования. Обзор достоинств и недостатков таких языков как Ассемблер, Паскаль, Си, Си++, Фортран, Кобол, Бейсик, SQL, HTML, Java.

    курсовая работа [759,5 K], добавлен 04.11.2014

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