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

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



++;(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=='') {+= 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 \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 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 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.