Разработка конвертора на языке Си для перевода программ на языке Паскаль в текст программы на языке Си
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
ot;\n");();= tdt;1;
}fread(int ln){s[256];sp;t;();_dt();_str("scanf");();(instr[inpos]!='(') return 0;++;_str("(\"");=0;(1) {();(stype!=w_str) return 0;= vartype();(t==t_Int) put_str("%d");return 0;[sp] = '&';+= slen;(&s[sp],&instr[inpos],slen);+= slen;+= slen;();(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();_str("printf");();(instr[inpos]!='(') return 0;++;_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) {();(stype!=w_str) return 0;= vartype();(t==t_Int) put_str("%d");return 0;(&s[sp],&instr[inpos],slen);+= slen;+= slen;();(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;
}ob_arif() {();(instr[inpos]=='+'){();
}(instr[inpos]=='-'){();
}(1){();(stype==w_numb) wcopy(); else(stype==w_str&&vartype()==t_Int) wcopy(); else(stype==w_str&&vartype()==t_Label) wcopy();return 1;
}
}ob_arifmetich(){c,c1;(!ob_arif()) return 0;();= instr[inpos];= instr[inpos+1];(c=='') {+= 2;_str("!=");
}(c=='=') {++;_str("==");
}(c=='>'||c=='<') {(c1=='='){+= 2;
}wcopy();
}();(!ob_arif()) return 0;1;
}ob_logich() {k;c,c1;arifm, ip,op;(1){();= fkW();ip, op;= inpos;= outlen;= 0;(instr[inpos]=='+'||[inpos]=='('||[inpos]=='-'||==w_str&&!fkW() ||==w_numb)= ob_arifmetich();(!arifm){= ip;= op;();= fkW();(stype==w_str&&k==kw_true){();_char('1');
}(stype==w_str&&k==kw_false) {();_char('0');
}(stype==w_str&&vartype()==t_Bool) wcopy(); else(instr[inpos]=='('){();(!ob_logich()) 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_Label||type==t_Int)) return 0;_char('\n');_dt();();();((type==t_Label)&&instr[inpos]==':')
{();++;_char('\n');1;
}(instr[inpos]!=':'||instr[inpos+1]!='=')0;_char('=');+= 2;(type==t_Bool) {(!ob_logich()) return 0;
}(!ob_arif()) return 0;();(wequ("to")||wequ("downto")) return 1;(instr[inpos]!=';') return 0;();_char('\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;++;;kw_write:++;(!fwrite(0)) return 0;++;;kw_writeln:++;(!fwrite(1)) return 0;++;;kw_read:++;(!fread(0)) return 0;++;;kw_readln:++;(!fread(1)) return 0;++;;kw_for:++;(!ffor()) return 0;++;;kw_function:(!ffunction()) 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;
}Konvektor()
{b;k;= kol2 = 0;_str("#include \n\n");{= 1;();= fkW();(k==kw_var){++;(!fvar(1)) {();
}kol2++; }(k==kw_type){++;(!frecord()) {();
}kol2++;
}(k==kw_function){(!ffunction()) {();
}
}(k==kw_begin){(!fbegin(1)) {();
}= 0;
}(IsComment()) CommEnd();{++;();
};
} while (b==1);(instr[inpos]!='.') return 0;++;1;
}main()
{(LC_ALL,"Russian");
char s[128];("Введите имя входного файла: ");
scanf("%s",s);(!openText(s))
{("\nОшибка открытия файла!");
}= NULL;= NULL;= cuservars;();
osvobw(1);("\nВведите имя выходного файла:");
scanf("%s",s);(!vvodText(s))
{("\nОшибка создания файла!");
}("\nКоличество операторов"
" в исходном файле: %d", kol1);("\nКоличество операторов"
" в полученном файле: %d", kol2);("\nКоличество ошибочных операторов"
" которые не были обработаны: %d", ker);("\n\nРезультат хранится в файле: %s",s);
fclose(file1);(file2);(!kbhit()) ;
}
7. Распечатка тестов и результатов
Проведем несколько тестов на анализ работоспособности получившейся программы:
Тест 1: Для анализа создадим программу, в которой есть все определяемые операторы (for(to), function, type), тип переменной integer и комментарии. Текст такой программы:
var
k,s,a: integer;
{объявление переменных}
type
rec = record
x,y: integer;
end;
(*начало функции*)pr(k: integer);i:=1 to 2 do(k);;
begin
write ('введите количество чисел числа ',s);
end.
транслятор программа паскаль алгоритм
Созданный компилятор должен определить данные заданием функции, тип переменных и комментарии.
В остальных случаях программа должна выводить на месте не определившихся операций и оставшуюся программу начиная с ошибочного оператора, помещать в коментарий. Распознавание арифметических и логических переменных происходит. Структура сохраняется.
Запустим компилятор и получим результат:
Текст в файле p.txt
#include k,s,a,i,l;
/*объявление переменных*/
struct rec
{
int x,y;
};
/*начало функции*/
void pr(int k)
{
{(=1;i<=l;i++)("%d",&k); printf("\n");
}
void main()
{
printf("введите количество чисел числа %d",s);
}
Тест 2: Пусть цикл for будет изменен с for(to) на for(downto):
var,s,a,i,l: integer;
{объявление переменных}= record,y: integer;;
(*начало функции*)pr(k: integer);i:=1 downto l do
readln(k);;('введите количество чисел числа ',s);.
Запустим компилятор и получим результат:
Текст в файле p.txt
#include k,s,a,i,l;
/*объявление переменных*/rec
{x,y;
};
/*начало функции*/pr(int k)
{
{( i=1;i<=l;i--)("%d",&k); printf("\n");
}main()
{("введите количество чисел числа %d",s);
}
Тест 3: Изменим код из файла p.txt: добавим ошибочный оператор while. Пусть теперь код программы на паскале:
var
k,s,a,i,l: integer;
{объявление переменных}
type
rec = record
x,y: integer;
end;
(*начало функции*)pr(k: integer);(l!=2)doi:=1 to 2 do(k);=l+1;;
end;('введите количество чисел числа ',s);.
Запустим компилятор и получим результат:
Текст в файле p.txt:
#include k,s,a,i,l;
/*объявление переменных*/rec
{x,y;
};
/*начало функции*/pr(int k)
{
{
(l!=2)dobedinfori:=1to2doreadln(k);
=l+1;
;
;main()
{("введите количество чисел числа %d",s);
}
Выводы
В процессе выполнения данной курсовой работы мы закрепили знания по диiиплине "Программирование на языке высокого уровня". Улучшили знания работы с файлами, циклами, ди