Разработка транслятора для перевода программы, написанной на языке Паскаль, в текст программы на языке Си
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
++;(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.