Транслятор на языке Си для перевода текста программы с языка Паскаль на язык Си (операторы real, case, записи, указатель (на запись))
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
quot;);;}_dt();_str("case ");((wtype!=w_str)&&(wtype!=w_numb)&&(wtype!=w_char)) return 0;(instr[inpos]=='\'') {wskip(); put_str("\'");}();();(instr[inpos]=='\'') {wskip(); put_str("\'");}();(instr[inpos]!=':') return 0;();();= 0; // по умолчанию ожидаем case 1: blabla;(wequ("begin")) {wskip(); beg = 1;};_str("\n");_dt();
fbegin(3); // 3 - означает обработку case_dt();
if (wequ("end")&&beg)
{put_dt();_str("break;\n");();(instr[inpos]==';') inpos++;
} else { put_dt(); put_str("break;\n");}}1;}frewrite()
{();(instr[inpos]!='(') return 0;++;_dt();_str("fcreate(");();(vartype()!=t_File) return 0;();(instr[inpos]!=')') return 0;++;_str(")");(instr[inpos]!=';') return 0;++;_str(";\n");1;}
/*int freset()
{();(instr[inpos]!='(') return 0;++;();();(instr[inpos]!=')') return 0;++;(instr[inpos]!=';') return 0;++;1;}fassign()
{t;();(instr[inpos]!='(') return 0;++;();(t = vartype())
{(t==t_File)
{_dt();();_str(" = fopen(\"");(instr[inpos]!=',') return 0;+=2;
(instr[inpos]!= '\'')
{[outlen] = instr[inpos];++;++;}++;_str("\"");_str(",\"w\"");();(instr[inpos]!=')') return 0;++;_str(")");(instr[inpos]!=';') return 0;++;_str(";\n");1;} }1;}
/*int fif()
{();_dt();_str("if (");(!fle()) return 0;_str(")\n");();(wequ("then")) wskip();return 0;1;}felse()
{();_dt();_str(" else\n");1;}*/
/*int fnew()
{();_dt();++;();(vartype())
{t_Int:();_str(" = new(int);\n");++;(instr[inpos]!=';') return 0;++;;t_Real:();_str(" = new(float);\n");++;(instr[inpos]!=';') return 0;++;;: return 0;}1;
}*/
/*int fdispose()
{();_dt();(instr[inpos]!='(') return 0;_str("delete ");++;();();(instr[inpos]!=')') return 0;_str(";\n");++;(instr[inpos]!=';') return 0;++;1;}*/
/*int fread(int ln){s[256];sp;t;();_dt();();(instr[inpos]!='(') return 0;++;();(t = vartype())
{(t==t_File)
{_str("fscanf(");();(instr[inpos]!=',') return 0;++;_str(",");(instr[inpos]!= ')')
{[outlen] = instr[inpos];++;++;
}();(instr[inpos]!=')') return 0;++;_str(")");(instr[inpos]!=';') return 0;++;_str(";\n");1;}}_str("scanf");_str("(\"");=0;(1) {();(wtype!=w_str) return 0;= vartype();(t==t_Int) put_str("%d");if (t==t_Real) put_str("%f");return 0;[sp] = '&';+= wlen;();(&s[sp],&instr[inpos],wlen);+= wlen;+= wlen;();(instr[inpos]!=',') break;[sp] = instr[inpos];++;++;
}_str("\",");(&outstr[outlen],s,sp);+= sp;();(instr[inpos]!=')') return 0;++;_char(')');();(instr[inpos]!=';') return 0;++;(ln) put_str("; printf(\"\\n\");\n");put_str(";\n");1;
}*/fwrite(int ln){s[256];sp;t;();_dt();();(instr[inpos]!='(') return 0;++;
/* Обработка файла */();(t = vartype())
{(t==t_File)
{_str("fprintf(");();(instr[inpos]!=',') return 0;+=2;_str(",\"");(instr[inpos]!= '\'')
{[outlen] = instr[inpos];++;++;
}++;_str("\"");();(instr[inpos]!=')') return 0;++;_str(")");(instr[inpos]!=';') return 0;++;_str(";\n");1;}_str("printf");_char('(');();(instr[inpos]!='\'') return 0;_char('"');++;(instr[inpos]!= '\'') {[outlen] = instr[inpos];++;++;}++;(instr[inpos]==')')
{(ln) put_str("\\n");_char(')');++;(instr[inpos]!=';') return 0;++;_str(";\n");1;}(instr[inpos]!=',') return 0;++;=0;(1) {();(wtype!=w_str) return 0;= vartype();(t==t_Int) put_str("%d");
/*else if (t==t_Real) put_str("%f");*/return 0;(&s[sp],&instr[inpos],wlen);+= wlen;+= wlen;();(instr[inpos]!=',') break;[sp] = instr[inpos];++;++;}(ln) put_str("\\n");_char('"');();_str("\,");(&outstr[outlen],s,sp);+= sp;();(instr[inpos]!=')') return 0;++;_char(')');();(instr[inpos]!=';') return 0;++;_str(";\n");1;}fae() {();(instr[inpos]=='+'){(); }(instr[inpos]=='-'){();}(1){();(wtype==w_numb) wcopy(); else(wtype==w_str&&vartype()==t_Int) wcopy(); /*else(wtype==w_str&&vartype()==t_Real) wcopy(); else(wtype==w_str&&vartype()==t_Array) {();();(instr[inpos]=='['){();(1) {(!fae()) return 0;_str("-1");();(instr[inpos]==']'){();; }(instr[inpos]==','){();_str("]["); } }
}
} else(instr[inpos]=='('){();(!fae()) return 0;();(instr[inpos]!=')') return 0;++;_char(')');
}*/return 0;();c = instr[inpos];(c=='+'||c=='-'||c=='*'||c=='/') wcopy();return 1;}
}ae(){c,c1;(!fae()) return 0;();= instr[inpos];= instr[inpos+1];(c=='') {+= 2;_str("!=");
}(c=='=') {++;_str("==");}(c=='>'||c=='<') {(c1=='='){+= 2; }wcopy();}();(!fae()) return 0;1;
}fle() {k;c,c1;arifm, ip,op;(1){();= fkW();ip, op;= inpos;= outlen;= 0;(instr[inpos]=='+'||[inpos]=='('||[inpos]=='-'||==w_str&&!fkW() ||==w_numb)= ae();(!arifm){= ip;= op;();= fkW();(wtype==w_str&&k==kw_true){();_char('1');}(wtype==w_str&&k==kw_false) {();_char('0');}(wtype==w_str&&vartype()==t_Bool) wcopy(); else(instr[inpos]=='('){();(!fle()) return 0;();(instr[inpos]!=')') return 0;++;_char(')');}return 0; }();= fkW();(k==kw_or) put_str("||"); else(k==kw_and) put_str("&&");return 1;();}}asign(){type = vartype();(!(type==t_Bool||/*type==t_Real||*/type==t_Int)) return 0;
//put_char('\n');_dt();();();(instr[inpos]!=':'||instr[inpos+1]!='=')0;_char('=');+= 2;(type==t_Bool) {(!fle()) return 0; }(!fae()) return 0;();(instr[inpos]!=';') return 0;();_char('\n');1;}
/*int frepeat() {();_dt();_str("do {\n");_dt();1;}funtil() {();_dt();_dt();_str("} while (");(!fle()) return 0;_char(')');();(instr[inpos]!=';') return 0;++;_str(";\n");1;}*/fwhile() {();_dt();_str("while (");(!fle()) return 0;();(wtype!=w_str||fkW()!=kw_do) return 0;();_str(")\n");1;}fbegin(int gl){rep_n = 0;(gl!=3) wskip();(gl==1) put_str("\n\nvoid main()\n");((gl!=2)||(gl!=3)) {_dt();_str("{\n");_dt(); }b;{= 1;();(IsComment()){();; }(fkW()){kw_begin:++;(!fbegin(0)) return 0;++;;
/*case kw_case:++;(!fcase()) return 0;;*/
/*case kw_read:++;(!fread(0)) return 0;++;;*/kw_write:++;(!fwrite(0)) return 0;++;;kw_rewrite:++;(!frewrite()) return 0;++;;
/*case kw_reset:++;(!freset()) return 0;++;;*/kw_assign:++;(!fassign()) return 0;++;;kw_while:++;(!fwhile()) return 0;++;;kw_end:++;(gl == 3) return 3;();_dt();_dt();_str("}\n");();(gl==1&&instr[inpos]=='.' ||!=1&&instr[inpos]==';'){();++;1;}
{();0;}0:(!asign()) return 0; //присваивание;:0; }
} while (b);1;}Translate()
{b;k;= koper2 = 0;_str("#include \n\n"); //для scanf и printf
do{= 1;();= fkW(); //проверка на ключевое слово(k==kw_var){ //начало блока переменных
koper1++;(!fvar(1)) {();}koper2++; }(k==kw_type){ koper1++;(!frecord()) {(); }koper2++;}(k==kw_begin){(!fbegin(1)) {();}= 0;}(IsComment()) CommEnd(); //комментарии{++;(); };
} while (b==1);
if (instr[inpos]!='.') return 0; //точка в конце программы
inpos++;1;}main()
{(LC_ALL,"Russian");
char s[128];("Введите имя входного файла: ");
scanf("%s",s);(!GetText(s))
{("\nОшибка открытия файла!"); }= NULL;= NULL;= cuservars;();
freevars(1);("\nВведите имя выходного файла:");
scanf("%s",s);(!PutText(s))
{("\nОшибка создания файла!"); }("\nКоличество операторов"
" в исходном файле: %d", koper1);("\nКоличество операторов"
" в полученном файле: %d", koper2);("\nКоличество ошибочных операторов"
" которые не были обработаны: %d", ker);("\n\nРезультат хранится в файле: %s",s);
fclose(file1);(file2);(!kbhit()) ;
}
7. Распечатка тестов и результатов
Для начала проверим программу на правильную обработку ошибочного ввода входного файла, для этого введем имя несуществующего файла:
программа алгоритм объектный ориентированный константа
Рисунок 7.1 - Вид экрана при вводе имени несуществующего файла
Рисунок 7.2 - Вид экрана при обработке файла firstfile
Рисунок 7.3 - Экран программы при обработке программы secondfile
Комментарий к полученным результатам:
Для исходного текста, в котором были записаны только определенные по заданию операторы, трансляция прошла успешно. При добавлении ошибочного оператора, транс