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

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

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

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

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

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

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

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

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

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

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

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

Вариант 8

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

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

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

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

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

Ставрополь 2011

Оглавление

Введение

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

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

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

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

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

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

Выводы

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

Введение

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

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*/

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Номер

begin

1

end

2

var

3

Char

4

boolean

5

False

6

true

7

and

8

or

9

case

10

assign

11

write

12

rewrite

13

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

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;

};

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("Пожалуйста, укажите файл для трансляции: ");

scanf("%s",s);

if (!i_file(s))

{

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

getch();

return;

}

vars = NULL;

lvars = NULL;

Translate();

freevars(1);

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

scanf("%s",s);

if (!o_file(s))

{

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

getch();

return;

}

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

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

printf("\nОшибок:%d", ker);

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

fclose(file1);

fclose(file2);

while (!kbhit()) ;

}

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

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

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*/

}

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

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

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}

sin(x);

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*/

< Ошибка! >

sin(x);

Выводы

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

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

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

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

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

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


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

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