Разработка конвертера на языке Си для перевода программ на языке Паскаль в текст программы на языке Си
Проблемы, связанные с использованием разных языков программирования для написания программ. Транслятор с языка Паскаль на язык Си, его функции и переменные. Кодирование алгоритма программы транслятора на языке Си++. Распечатка тестов и результатов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 23.06.2011 |
Размер файла | 377,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Государственное образовательное учреждение
высшего профессионального образования
«Северо-кавказский государственный университет»
КУРСОВОЙ ПРОЕКТ
по дисциплине «Программирование на языке высокого уровня»
Вариант 16
Исполнитель:
Сивакова К.А.
Группа АСОУ-091
Руководитель:
Братченко Н.Ю.
Ставрополь, 2011
Содержание:
1. Описание задания для курсового проекта
2. Постановка задачи
2.1 Название задачи
2.2 Описание
2.4 Входные данные
2.5 Выходные данные
2.6 Ошибки
3. Выбор метода решения
4. Описание функций и переменных транслятора
5. Разработка алгоритма
6. Кодирование алгоритма программы транслятора на языке Си++
7. Распечатка тестов и результатов
8. Выводы
9. Список использованной литературы
1. Описание задания для курсового проекта
Цель: спроектировать транслятор с языка Паскаль на язык Си, произвести отладку и документирование данного проекта.
Данная цель дает возможность использовать знания дисциплины «Программирование на языке высокого уровня».
Курсовая работа включает в себя ступени выполнения с разработки технического задания и заканчивается описанием проделанной работы в отчете.
Тема: «Разработка конвертора на языке Си для перевода программ на языке Паскаль в текст программы на языке Си».
По заданию на данный проект нужно: составить транслятор на языке Си для перевода программ с языка Паскаль в текст программы на языке Си.
Допустимые операторы в исходном тексте, типы переменных, синтаксис логических и арифметических выражений определяются по вариантам.
- должны быть приведены синтаксические диаграммы для данных операторов, в соответствии с которыми будет производиться анализ операторов исходного текста и их конвертирование (по согласованию с преподавателем синтаксис некоторых сложных операторов может быть упрощен);
-должны быть описаны возможные и обязательные использования пробелов в исходном тексте;
-исходные данные и результат хранятся в текстовых файлах, их имена должны запрашиваются транслятором;
- если обнаружена синтаксическая ошибка оператора: в выходной файл вносится комментарий об ошибке;
- обработка отдельных операторов описываются как подпрограммы;
-оформить вывод комментарий из исходного файла в выходной;
- ключевые слова операторов в программе на языке Си записываются только строчными буквами, а в программе на языке Паскаль они могут быть записаны и строчными и прописными;
- в виде идентификаторов используются любые буквы;
-в одной строке исходного текста может быть записано несколько операторов или только часть одного оператора.
Так же нужно учитывать, что при формировании текста можно не использовать правило отступа.
2. Постановка задачи
2.1 Название задачи
Решаемой задачей на данный курсовой проект является создание компилятора, транслирующего исходный файл, с текстом на зыке Паскаль в выходной файл с текстом на языке Си, включающий в себя перевод обозначенных заданием операторов, комментарий, типа переменных и обозначения всех ошибочных операторов.
Данная задача актуальна из-за некоторых проблем, связанных с использованием разных языков программирования для написания программ, как например Delphi или Паскаль. Для людей знающих всего несколько языков, не включающих выше перечисленные, данная проблема будет стоять особенно остро. Язык Си и Си++ на наше время являются наиболее известными, поэтому именно этот язык мы используем для трансляции заданной программы. Кроме того, язык Си и Си++ так же наиболее эффективный и перевод программ именно на этот язык упрощает роботу с программой. Транслятор дает возможность обеспечить более дешевую разработку программы без затраты в дальнейшем на человеческие ресурсы.
2.2 Описание
Данная программа включается в себя использование исходных данных, которые подразумевают под собой текст с программой на языке Паскаль, включающий: операторы, заданные вариантом и являющиеся по определению ошибочными, комментарии, которые будут выводиться в выходной файл, описание типов переменных, подпрограмм и иных структур.
Сама программа будет реализовывать транслирование по типу:
- чтение из исходного файла - весь файл представляет собой одну большую символьную строку, с которой мы будем работать в дальнейшем;
-проверка строки на ключевые слова, описанные как массив ключевых слов;
-проверка на функции;
-проверка на операторы;
-проверка на комментарии;
-вывод текста в выходной файл: число операторов в исходной программе, число операторов в полученной программе, число ошибочных операторов в полученной программе. |
Адрес исходного и выходного файла вводятся пользователем с клавиатуры.
2.3 Входная информация
По заданному условию путь к исходным данным задает пользователь. Файл будет иметь формат текста (txt), однако разрешение файла указывать не обязательно.
Заданный адрес будет обрабатываться программой и при указании несуществующего файла - выдается сообщение об ошибке. Программа не продолжает работу.
printf("Имя исходного файла:");
scanf("%s",s);
где s- массив типа char.
2.4 Выходная информация
Данные будут записываться в выходной файл, который задает пользователь в начале работы программы. Файл имеет текстовое расширение и содержит:
-модуль #include <stdio.h>- как статичный элемент разработки программ;
-название программы;
- сообщения об ошибках на месте неопознанных операторов;
-определенные по условию операторы (If Le Then, New, dispose, указатель(на запись))-переменные типа integer;
-арифметические конструкции;
-логические конструкции;
-объявление главной программы;
-замену begin, end на {,};
-присутствующие в исходном файле комментарии.
Пробелами в выходном файле пренебрегли.
К выходным данным так же будут относится, данные выдающиеся на экран, описанные функцией:
printf("\nКоличество операторов"
" в исходной программе: %d", koper1);
printf("\nКоличество операторов"
" в полученной программе: %d", koper2);
printf("\nКоличество ошибочных операторов"
" в полученной программе: %d", ker);
printf("\n\nФайл с результатом: %s",s);
где:
koper1 -количество операторов в исходном файле
koper2 - количество операторов в выходном файле
ker - количество ошибок
s -имя выходного файла
2.5 Ошибки
При работе с данной программой пользователь может совершить ошибки:
- неправильное имя исходного файла:
printf("Имя исходного файла:");
scanf("%s",s);
if (!GetText(s))
{ printf("\nОшибка открытия файла!"); }
- неправильное имя входного файла:
printf("\nИмя выходного файла:");
scanf("%s",s);
if (!PutText(s))
{ printf("\nОшибка создания файла!");
}
В обоих случаях происходит выход из программы. Повторный ввод данных возможен только при новом запуске программы.
3. Метод решения задачи
Данный этап включает в себя описания логической и математической модели решения задачи, и словесное описание модели в виде плана действий.
Опишем логическую и математическую модель получения данных, использованные в курсовой работе. В данных моделях, описанных графически, принимается, что синтаксические диаграммы одинаковы для языков Паскаль и Си.
Пусть мы имеем некое выражение Le1, проверим его по нашей логической модели получения данных:
- Проверка является ли выражение Le1 знаком =, <>, >, >=, <=, <, если да, то вывод выражения;
Пусть мы имеем некое выражение Le3, проверим его по нашей логической модели получения данных:
1. Проверка является ли выражение Le3 знаком + или -, если да, то выход;
2. Проверка является ли слагаемое множителем знака * или /, если да, то выход;
3. Проверка является ли множитель: константой без знака, переменной, иначе логическое выражение, заключаем в круглые скобки, если переменная то выход;
4. Если переменная - индификатор заключаем выражение в квадратные скобки. Выход;
5. Если константа без знака, присваиваем последовательность: целое- выход или целое - точка - целое или целое - точка- целое - е - определенный знак (+,-) - целое - выход;
6. Если выражение - целое и если цифра - выход.
4. Описание функций и переменных транслятора
Нарисуем структуру программы:
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Где:
1. Newtype -установка типа переменной
2. Vartype - получение типа переменной, при этом тип задан заранее
3. Ocvobw- освобождение списка переменных - просто удаление обоих списков, как для локальных переменных, так и для глобальных переменных
4. Analiz- Одна из главных функций получение слова, посимвольно анализируется текст.
Программа анализирует текст посимвольно и каждый раз определяет тип символа (число, буква, пробел ит.д.), когда удается ясно определить значение этого символа (цифра, переменная и т.д.) или последовательности символов( переменная, ключевое слово и т.д.) выполнение функции прерывается она возвращает тип этого слова Функция возвращает один из следующих кодов типа "слова":
- w_error - ошибка
- w_space - пробелы
- w_str - строка
- w_numb - число
- w_char - символ
5. put_str- запись строки в выходной буфер
6. scmp - возвращает значения буферов
7. put_char - запись символа в выходной буфер
8. wcopy - копирование буферов
9. wequ -возвращает значение scmp
10. AnalizS -получение слов, пропуск пробелов
11. inc_dt- увеличение отступа
12. dec_dt -уменьшение отступа
13. put_dt - вывод отступа
14. OpenText -открытие файла
15. VvodText -вывод обработанного текста
16. Oshibka - вывод ошибочного оператора
17. IsComment -проверка на комментарии
18. CommEnd -проверка на закрытие комментарий
19. fkW - проверка на ключевое слово, сравниваются полученное нами слово со словом из списка и если да, то возвращается номер слова в списке
20. fIntRealBoolAr - обработка переменных после слова var, обращения к тем четырем функциям работающим со списком переменных и обработка описания переменных: x1,..,xn: тип;
21. fvar -обработка описания блока переменных
22. fvardescr -обработка блока переменных
23. fbegin - обработка блоков операторов
24. fif -обработка оператора if
25. frecord - обработка оператора record
26. ob_arif - обработка арифметического выражения
27. ob_arifmetich -обработка арифметического выражения
28. ob_logich -обработка логического выражения
29. asign -проверка на присваивание
30. fdispose -обработка оператора dispose
31. Konvektor -главная функция преобразования текста
32. Main - основная программа
33. felse -обработка оператора else
34. fnew - обработка оператора new
5. Описание алгоритма
На псевдоязыке опишем алгоритмы главной программы и основных процедур транслятора: Konvektor, AnalizS.
Основная программа main:
Начало
Ввод адреса исходного файла
Проверка: если адрес не правильный, то ошибка
Вызываем процедуру Konvektor
Ввод адреса выходного файла
Проверка: если адрес не правильный, то ошибка
Вывод информации на экран Конец
Описание подпрограммы Konvektor:
Начало
Анализ данных AnalizS
Проверка на ключевое слово fkW
Начало блока переменных
Проверка на ошибки ключевых слов
Блок описания типов
Начало блока операторов fbegin
Проверка на наличие комментарий IsComment / CommEnd
Точка в конце программы Конец
Описание подпрограммы AnalizS
Начало
Анализ длинны слова
Проверка символов
Если буква или цифра то увеличивает счетчик
Если знак препинания то возвращает что это символ
Если конец строки или пробел то возвращает, что этот символ пробел
Проверка на дробное число Конец
6. Кодирование аллгоритма программы транслятора на языке Си++
Оставленный нами текст программы на языке Си++ будет иметь вид:
// курсовая_1111.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <locale.h>
FILE *file1, *file2;
const int buff = 10000;
const int KSn = 17;
char * KSs[KSn] =
{
"begin", "end", "var", "write",
"writeln", "false",
"true", "read", "readln",
"type", "record", "and",
"or","dispose", "if", "else", "new",
};
#define KS_begin 1
#define KS_end 2
#define KS_var 3
#define KS_write 4
#define KS_writeln 5
#define KS_false 6
#define KS_true 7
#define KS_read 8
#define KS_readln 9
#define KS_type 10
#define KS_record 11
#define KS_and 12
#define KS_or 13
#define KS_dispose 14
#define KS_if 15
#define KS_else 16
#define KS_new 17
#define t_Int 1
#define t_Bool 3
const int cuservars = 6;
int uvars;
#define w_error 0
#define w_space 1
#define w_str 2
#define w_numb 3
#define w_char 4
char instr[buff],
outstr[buff];
int inlen,outlen,inpos;
int kol1,kol2,ker;
int slen;
int stype;
int snumf;
int dt;
typedef struct var{
char s[64];
int tp;
var * next;
};
typedef struct types{
char s[64];
int tid;
types * next;
};
var *vars, *lvars;
types * typeslist;
int ob_logich ();
int ob_arif ();
int asign();
int dobabit_var(int gl){
var *np, *p;
if (gl) p = vars; else p = lvars;
while (p) {
if (strlen(p->s)==slen&&
!memcmp(p->s,&instr[inpos],slen)) return 0;
p = p->next;
}
np = new var;
memcpy(np->s,&instr[inpos],slen);
np->s[slen]=0;
np->tp = -1;
if (gl) {
np->next = vars;
vars = np;
} else {
np->next = lvars;
lvars = np;
}
return 1;
}
int addnestype()
{
types *head=typeslist, *ntype;
while (head) {
if (strlen(head->s)==slen&&
!memcmp(head->s,&instr[inpos],slen)) return 0;
head = head->next;
}
ntype = new types;
memcpy(ntype->s,&instr[inpos],slen);
ntype->s[slen]=0;
ntype->tid = uvars;
uvars++;
ntype->next = typeslist;
typeslist = ntype;
return 1;
}
int uvart()
{
types *head=typeslist;
while(head)
{
if (strlen(head->s)==slen&&
!memcmp(head->s,&instr[inpos],slen)) return head->tid;
head = head->next;
}
return 0;
}
char* utname(int number)
{
types *head=typeslist;
while(head)
{
if (head->tid==number) return head->s;
head = head->next;
}
return 0;
}
void newtype(int gl, int type){
var *p;
if (gl) p = vars; else p = lvars;
while (p) {
if (p->tp==-1) p->tp = type;
p = p->next;
}
}
int vartype(){
var * p;
p = lvars;
while (p) {
if (strlen(p->s)==slen&&
!memcmp(p->s,&instr[inpos],slen)) return p->tp;
p = p->next;
}
p = vars;
while (p) {
if (strlen(p->s)==slen&&
!memcmp(p->s,&instr[inpos],slen)) return p->tp;
p = p->next;
}
return 0;
}
char* usertype()
{
types * p;
p = typeslist;
while (p) {
if (strlen(p->s)==slen&&
!memcmp(p->s,&instr[inpos],slen)) return p->s;
p = p->next;
}
}
void Ocvobw(int gl){
var *p, *pp;
p = lvars;
while (p) {
pp = p;
p = p->next;
delete pp;
}
lvars = NULL;
if (gl) {
p = vars;
while (p) {
pp = p;
p = p->next;
delete pp;
}
vars = NULL;
}
}
int Analiz()
{
int st = 0;
char c;
slen = 0;
while (slen+inpos<inlen ){
c = instr[inpos+slen];
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=='\''
)
{ slen = 1; return stype = w_char; }
else { slen = 0; return stype = w_error; }
break;
case 1:
if (c==' ' || c=='\t' || c=='\n') slen++;
else return stype = w_space;
break;
case 2:
if (
(c>='A' && c<='Z') ||
(c>='a' && c<='z') ||
(c>='0' && c<='9') ||
c=='_'
) slen++;
else return stype = w_str;
break;
case 3:
if (c>='0' && c<='9') slen++; else
if (c=='.'&& instr[inpos+slen+1]!='.') {
slen++;
st = 5;
}
else{
snumf = 0;
return stype = w_numb;
}
break;
case 5:
if (c>='0' && c<='9') slen++; else {
snumf = 1;
return stype = w_numb;
}
}
}
slen = 0;
return 0;
}
void put_str(char * s){
int l = strlen(s);
memcpy(&outstr[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){
outstr[outlen] = c;
outlen++;
}
void wcopy(){
memcpy(&outstr[outlen],&instr[inpos],slen);
inpos += slen;
outlen += slen;
}
int wequ(char * s){
return (!scmp(&instr[inpos],s,slen));
}
void wskip(){
inpos += slen;
}
void wstr(char * s){
strncpy(s,&instr[inpos],slen);
}
int AnalizS(){
Analiz();
if (stype==w_space) {
wskip();
Analiz();
}
return stype;
}
void inc_dt()
{
dt += 2;
}
void dec_dt()
{
dt -= 2;
}
void put_dt()
{
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);
put_str(s);
}
}
int OpenText(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>buff) inlen = buff;
inlen = fread(instr,1,inlen,file1);
instr[inlen] = 0;
inpos = 0;
outlen = 0;
return 1;
}
int VvodText(char * s2)
{
if ((file2 = fopen(s2, "wt")) == NULL){
return 0;
}
fwrite(outstr,outlen,1,file2);
return 1;
}
void Oshibka()
{
put_char('\n');
put_str("< Ошибка! > \n");
int k;
while (1){
AnalizS();
if (instr[inpos]== ';' || inpos>= inlen) {
wcopy();
break;
};
wcopy();
}
ker++;
}
int IsComment(){
return (instr[inpos]=='{' ||
instr[inpos]=='(' ||instr[inpos+1]=='*');
}
void CommEnd(){
if (instr[inpos]=='{'){
outstr[outlen] = '/';
outstr[outlen+1] = '*';
inpos++;
outlen += 2;
while (instr[inpos]!='}' && inpos<inlen) {
if (inpos>=inlen) return;
outstr[outlen] = instr[inpos];
inpos++;
outlen++;
}
outstr[outlen] = '*';
outstr[outlen+1] = '/';
inpos++;
outlen += 2;
}
else{
outstr[outlen] = '/';
outstr[outlen+1] = '*';
inpos += 2;
outlen += 2;
while (!(instr[inpos]=='*' && instr[inpos+1]==')')
&& inpos<inlen) {
if (inpos>=inlen) return;
outstr[outlen] = instr[inpos];
inpos++;
outlen++;
}
outstr[outlen] = '*';
outstr[outlen+1] = '/';
inpos += 2;
outlen += 2;
}
put_char('\n');
}
int fKS(){
for (int i=0; i<KSn; i++){
if (!scmp(&instr[inpos],KSs[i],slen))
return i+1;
}
return 0;
}
int fIntRealBoolAr(int svar, int gl){
char s[256];
int label;
int sp = 0;
AnalizS();
while (1){
if (stype!=w_str||fKS()|| gl>0&&vartype() ) return 0;
dobabit_var(gl);
if (svar) {
s[sp] = '&';
s[sp+1] = ' ';
sp += 2;
}
memcpy(&s[sp],&instr[inpos],slen);
inpos += slen;
sp += slen;
AnalizS();
if (instr[inpos]==','){
s[sp]=',';
inpos++;
sp++;
} else break;
AnalizS();
}
if (instr[inpos]==':'){
inpos++;
AnalizS();
if ((stype!=w_str)&&(stype!=w_char)) return 0;
if (!scmp(&instr[inpos],"integer",slen)){
newtype(gl,t_Int);
put_str("int ");
wskip();
memcpy(&outstr[outlen],&s[0],sp);
outlen += sp;
}
else
if (!scmp(&instr[inpos],usertype(),slen)){
put_str(usertype());
put_str(" ");
wskip();
memcpy(&outstr[outlen],&s[0],sp);
outlen += sp;
}
else
if (!scmp(&instr[inpos],"^",slen)){
wskip();
AnalizS();
newtype(gl,uvart());
wcopy();
put_str(" * ");
memcpy(&outstr[outlen],&s[0],sp);
outlen += sp;
}
}
else return 0;
return 1;
}
int fvar(int gl){
inpos += slen;
AnalizS();
do{
kol1++;
if (IsComment()){
CommEnd();
kol2++;
continue;
}
put_dt();
if (!fIntRealBoolAr(0,gl)) Oshibka();
else kol2++;
AnalizS();
if (instr[inpos]!=';')
return 0;
wskip();
put_str(";\n");
AnalizS();
if (stype!=w_str || fKS())
return 1;
}while(1);
}
int fvardescr(){
inpos += slen;
int k,svar;
AnalizS();
do{
k = fKS();
svar = k==KS_var;
if (svar) {
wskip();
AnalizS();
}
if (!fIntRealBoolAr(svar,0)) return 0;
AnalizS();
if (instr[inpos]!=';') return 1;
wskip();
put_str(", ");
AnalizS();
k= fKS();
if (stype!=w_str || k&&k!=KS_var) return 0;
}while(1);
}
int fbegin(int k);
int frecord(){
wskip();
put_str("struct ");
AnalizS();
if (stype!=w_str || fKS()) return 0;
addnestype();
wcopy();
AnalizS();
if (instr[inpos]!='=') return 0;
wskip();
AnalizS();
if (!wequ("record")) return 0;
put_str("\n{\n");
inc_dt();
if (!fvar(-1)) return 0;
dec_dt();
AnalizS();
if (!wequ("end")) return 0;
wskip();
put_char('}');
AnalizS();
if (instr[inpos]!=';') return 0;
wcopy();
put_str("\n\n");
inpos += slen;
return 1;
}
int fif()
{
wskip();
put_dt();
put_str("if (");
if (!ob_logich ()) return 0;
put_str(")\n");
AnalizS();
if(wequ("then")) wskip();
else return 0;
return 1;
}
int felse()
{
wskip();
put_dt();
put_str(" else\n");
return 1;
}
int fnew()
{
int utype;
wskip();
put_dt();
inpos++;
AnalizS();
switch(utype=vartype())
{
case t_Int:
wcopy();
put_str(" = new(int);\n");
inpos++;
if (instr[inpos]!=';') return 0;
inpos++;
break;
}
if(utype>=cuservars)
{
wcopy();
put_str(" = new(");
put_str(utname(utype));
put_str(");\n");
inpos++;
if (instr[inpos]!=';') return 0;
inpos++;
}
return 1;
}
int fdispose()
{
wskip();
put_dt();
if (instr[inpos]!='(') return 0;
put_str("delete ");
inpos++;
AnalizS();
wcopy();
if (instr[inpos]!=')') return 0;
put_str(";\n");
inpos++;
if (instr[inpos]!=';') return 0;
inpos++;
return 1;
}
int fread(int ln){
char s[256];
int sp;
int t;
wskip();
put_dt();
put_str("scanf");
AnalizS();
if (instr[inpos]!='(') return 0;
inpos++;
put_str("(\"");
sp=0;
while (1) {
AnalizS();
if (stype!=w_str) return 0;
t = vartype();
if (t==t_Int) put_str("%d");
else return 0;
s[sp] = '&';
sp += slen;
memcpy(&s[sp],&instr[inpos],slen);
inpos += slen;
sp += slen;
AnalizS();
if (instr[inpos]!=',') break;
s[sp] = instr[inpos];
inpos++;
sp++;
}
put_str("\",");
memcpy(&outstr[outlen],s,sp);
outlen += sp;
AnalizS();
if (instr[inpos]!=')') return 0;
inpos++;
put_char(')');
AnalizS();
if (instr[inpos]!=';') return 0;
inpos++;
if (ln) put_str("; printf(\"\\n\");\n");
else put_str(";\n");
return 1;
}
int fwrite(int ln){
char s[256];
int sp;
int t;
wskip();
put_dt();
put_str("printf");
AnalizS();
if (instr[inpos]!='(') return 0;
inpos++;
put_char('(');
AnalizS();
if (instr[inpos]!='\'') return 0;
put_char('"');
inpos++;
while (instr[inpos]!= '\'') {
outstr[outlen] = instr[inpos];
inpos++;
outlen++;
}
inpos++;
if (instr[inpos]==')')
{
if (ln) put_str("\\n");
put_char(')');
inpos++;
if (instr[inpos]!=';') return 0;
inpos++;
put_str(";\n");
return 1;
}
if (instr[inpos]!=',') return 0;
inpos++;
sp=0;
while (1) {
AnalizS();
if (stype!=w_str) return 0;
t = vartype();
if (t==t_Int) put_str("%d");
else return 0;
memcpy(&s[sp],&instr[inpos],slen);
inpos += slen;
sp += slen;
AnalizS();
if (instr[inpos]!=',') break;
s[sp] = instr[inpos];
inpos++;
sp++;
}
if (ln) put_str("\\n");
put_char('"');
AnalizS();
put_str("\,");
memcpy(&outstr[outlen],s,sp);
outlen += sp;
AnalizS();
if (instr[inpos]!=')') return 0;
inpos++;
put_char(')');
AnalizS();
if (instr[inpos]!=';') return 0;
inpos++;
put_str(";\n");
return 1;
}
int ob_arif () {
AnalizS();
if (instr[inpos]=='+'){
wcopy();
}
else
if (instr[inpos]=='-'){
wcopy();
}
while (1){
AnalizS();
if (stype==w_numb) wcopy(); else
if (stype==w_str&&vartype()==t_Int) wcopy(); else
if (instr[inpos]=='('){
wcopy();
if (!ob_arif ()) return 0;
AnalizS();
if (instr[inpos]!=')') return 0;
inpos++;
put_char(')');
}
else return 0;
AnalizS();
char c = instr[inpos];
if (c=='+'||c=='-'||c=='*'||c=='/') wcopy();
else return 1;
}
}
int ob_arifmetich (){
char c,c1;
if (!ob_arif ()) return 0;
AnalizS();
c = instr[inpos];
c1 = instr[inpos+1];
if (c=='<'&&c1=='>') {
inpos += 2;
put_str("!=");
}
else
if (c=='=') {
inpos++;
put_str("==");
}
else
if (c=='>'||c=='<') {
if (c1=='='){
inpos += 2;
}
else wcopy();
}
AnalizS();
if (!ob_arif ()) return 0;
return 1;
}
int ob_logich () {
int k;
char c,c1;
int arifm, ip,op;
while (1){
AnalizS();
k = fKS();
int ip, op;
ip = inpos;
op = outlen;
arifm = 0;
if(instr[inpos]=='+'||
instr[inpos]=='('||
instr[inpos]=='-'||
stype==w_str&&!fKS() ||
stype==w_numb)
arifm = ob_arifmetich ();
if (!arifm){
inpos = ip;
outlen = op;
AnalizS();
k = fKS();
//------
if (stype==w_str&&k==KS_true){
wskip();
put_char('1');
}
else
if (stype==w_str&&k==KS_false) {
wskip();
put_char('0');
}
else
if (stype==w_str&&vartype()==t_Bool) wcopy(); else
if (instr[inpos]=='('){
wcopy();
if (!ob_logich ()) return 0;
AnalizS();
if (instr[inpos]!=')') return 0;
inpos++;
put_char(')');
}
else return 0;
}
AnalizS();
k = fKS();
if (k==KS_or) put_str("||"); else
if (k==KS_and) put_str("&&");
else return 1;
wskip();
}
}
int asign(){
int type = vartype();
put_dt();
wcopy();
AnalizS();
if (instr[inpos]!=':'||instr[inpos+1]!='=')
return 0;
put_char('=');
inpos += 2;
if (type==t_Bool) {
if (!ob_logich ()) return 0;
}
else
if (!ob_arif ()) return 0;
AnalizS();
if (wequ("to")||wequ("downto")) return 1;
if (instr[inpos]!=';') return 0;
wcopy();
put_char('\n');
return 1;
}
int fbegin(int gl){
int rep_n = 0;
if(gl!=3) wskip();
if (gl==1) put_str("\n\nvoid main()\n");
if ((gl!=2)||(gl!=3)) {
put_dt();
put_str("{\n");
inc_dt();
}
int b;
do{
b = 1;
AnalizS();
if (IsComment()){
CommEnd();
continue;
}
switch(fKS()){
case KS_begin:
kol1++;
if (!fbegin(0)) return 0;
kol2++;
break;
case KS_write:
kol1++;
if (!fwrite(0)) return 0;
kol2++;
break;
case KS_writeln:
kol1++;
if (!fwrite(1)) return 0;
kol2++;
break;
case KS_read:
kol1++;
if (!fread(0)) return 0;
kol2++;
break;
case KS_readln:
kol1++;
if (!fread(1)) return 0;
kol2++;
break;
case KS_if:
kol1++;
if (!fif()) return 0;
break;
case KS_new:
kol1++;
if (!fnew()) return 0;
break;
case KS_else:
kol1++;
if (!felse()) return 0;
break;
case KS_dispose:
kol1++;
if (!fdispose()) return 0;
break;
case KS_end:
kol1++;
if(gl == 3) return 3;
wskip();
dec_dt();
put_dt();
put_str("}\n");
AnalizS();
if (gl==1&&instr[inpos]=='.' ||
gl!=1&&instr[inpos]==';'){
wskip();
kol2++;
return 1;
}
else
{
wskip();
return 0;
}
case 0:
if (!asign()) return 0;
break;
default:
return 0;
}
} while (b);
return 1;
}
программа кодирование алгоритм паскаль
int Konvektor()
{
int b;
int k;
kol1 = kol2 = 0;
put_str("#include <stdio.h>\n\n");
do{
b = 1;
AnalizS();
k = fKS();
if (k==KS_var){
kol1++;
if (!fvar(1)) {
Oshibka();
}
else kol2++; }
else
if (k==KS_type){
kol1++;
if (!frecord()) {
Oshibka();
}
else kol2++;
}
else
if (k==KS_begin){
if (!fbegin(1)) {
Oshibka();
}
b = 0;
}
else
if (IsComment()) CommEnd();
else {
kol1++;
Oshibka();
};
} while (b==1);
if (instr[inpos]!='.') return 0;
inpos++;
return 1;
}
void main()
{
setlocale(LC_ALL,"Russian");
char s[128];
printf("Введите имя входного файла: ");
scanf("%s",s);
if (!OpenText(s))
{
printf("\nОшибка открытия файла!");
}
vars = NULL;
lvars = NULL;
uvars = cuservars;
Konvektor();
Ocvobw(1);
printf("\nВведите имя выходного файла:");
scanf("%s",s);
if (!VvodText(s))
{
printf("\nОшибка создания файла!");
}
printf("\nКоличество операторов"
" в исходном файле: %d", kol1);
printf("\nКоличество операторов"
" в полученном файле: %d", kol2);
printf("\nКоличество ошибочных операторов"
" которые не были обработаны: %d", ker);
printf("\n\nРезультат хранится в файле: %s",s);
fclose(file1);
fclose(file2);
while (!kbhit()) ;
}
8. Распечатка тестов и результатов
Проведем несколько тестов на анализ работоспособности получившейся программы:
Тест 1: Для анализа создадим программу, в которой есть все определяемые операторы (If Le Then, New, dispose, указатель(на запись), тип переменной integer и комментарии.
Текст такой программы:
type
graph = record
x,y:integer;
end;
(*блок описания переменных*)
var
q:graph;
line: ^graph;
i,j,z:integer;
{начало программы}
begin
new(z);
i:=4;
if i>10 then i:=+1; else i:=i-1;
dispose(z);
end.
Созданный компилятор должен определить данные заданием функции, тип переменных и комментарии.
В остальных случаях программа должна выводить <Ошибка> на месте не определившихся операций и оставшуюся программу начиная с ошибочного оператора, помещать в коментарий. Распознавание арифметических и логических переменных происходит. Структура сохраняется.
Запустим компилятор и получим результат:
Текст в файле w1.txt
#include <stdio.h>
struct graph
{
int x,y;
};
/*блок описания переменных*/
graph q;
graph * line;
int i,j,z;
/*начало программы*/
void main()
{
z = new(int);
i=4;
if (i>10)
i=+1;
else
i=i-1;
delete z;
}
Тест 2: Изменим код из файла w.txt: добавим ошибочный оператор for. Пусть теперь код программы на паскале:
type
graph = record
x,y:integer;
end;
(*блок описания переменных*)
var
q:graph;
line: ^graph;
i,j,z:integer;
{начало программы}
begin
new(z);
i:=4;
if i>10 then i:=+1; else i:=i-1;
for i:=1 to 5 do
dispose(z);
end.
Запустим компилятор и получим результат:
Текст в файле w1.txt:
#include <stdio.h>
struct graph
{
int x,y;
};
/*блок описания переменных*/
graph q;
graph * line;
int i,j,z;
/*начало программы*/
void main()
{
z = new(int);
i=4;
if (i>10)
i=+1;
else
i=i-1;
for
< Ошибка! >
i:=1to5dodispose(z);
8. Выводы
В процессе выполнения данной курсовой работы мы закрепили знания по дисциплине «Программирование на языке высокого уровня». Улучшили знания работы с файлами, циклами, динамической памятью, структурами, рекурсией, процедурами и функциями.
В курсовой работе разработана программа, позволяющая частично транслировать с языка Паскаль на язык Си некоторые функции, обрабатывать комментарии, целочисленный тип переменных, начало и конец цикла, а так же определять логические и арифметические выражения.
9. Список использованной литературы
1.Н.Ю.Братченко «Методические указания по выполнению курсового проекта по дисциплине «Программирование на языке высокого уровня» для студентов специальности 230102 Автоматизированные системы обработки информации и управления», 2006
2. В.Б.Попов «Turbo Pascal», Москва “Финансы и статистика”, 2006
3. Зайцева, Л. В. Алгоритмические языки и программирование. 1995.
Размещено на Allbest.ru
Подобные документы
Выбор метода проектирования транслятора с языка Паскаль на язык Си, разработка и кодирование алгоритма программы. Использование допустимых операторов в исходном тексте, определение типов переменных и синтаксиса логических и арифметических выражений.
курсовая работа [1,0 M], добавлен 03.07.2011Создание транслятора, обрабатывающего код программы на языке Паскаль и за счет эквивалентных операторов генерирующего программу на Си. Особенности внешней спецификации и работы лексического анализатора. Структура программы, вывод результатов на экран.
курсовая работа [254,0 K], добавлен 02.07.2011Создание приложения, исполняющего трансляцию программы из языка Паскаль в язык Си: разработка алгоритма реализации задачи, описание необходимых констант, переменных, функций и операторов, представление листинга программы и распечатка результатов.
курсовая работа [305,9 K], добавлен 03.07.2011Схема разбора арифметического и логического выражения. Внешняя спецификация конвертора и алгоритм перевода программ на языке Паскаль в текст на языке Си. Назначение подпрограмм, особенности констант и переменных. Код программы и ее тестирование.
курсовая работа [567,5 K], добавлен 03.07.2011Создание программы для перевода кодов с языка Pascal на язык Си. Обработка программ операторами case, assign, rewrite и write. Способы объявления файла, комментария, переменных, логических и арифметических выражений. Виды синтаксических анализаторов.
курсовая работа [461,0 K], добавлен 03.07.2011Последовательность работ при разработке объектно-ориентированных программ. Виды синтаксических анализаторов и способы их применения. Описание алгоритма и анализ результативности работы программы, написанной на языке С, ее константы, переменные и функции.
курсовая работа [441,7 K], добавлен 03.07.2011Программный комплекс для разработки программы транслирующей программу с языка Pascal на язык С++. Построение логической и арифметической модели решения. Разработка компилятора для программы. Методы отладки программы и создание для нее документации.
курсовая работа [742,6 K], добавлен 03.07.2011Составление транслятора на языке С для перевода кода программы из языка Pascal в код программы на языке Cи. Распознавание и перевод конструкций: for, type, function, integer. Вешняя спецификация, описание, структура, текст программы; распечатка текстов.
курсовая работа [287,8 K], добавлен 24.06.2011Язык программирования Турбо Паскаль. Запись алгоритма на языке программирования и отладка программы. Правила записи арифметических выражений. Стандартное расширение имени файла, созданного системным редактором. Составной оператор и вложенные условия.
курсовая работа [75,0 K], добавлен 21.03.2013Сравнительный анализ языков программирования высокого уровня Си и Паскаль. Реализация алгоритма обработки данных. Тестирование и отладка программы или пакета программ. Структура программы на языке Турбо Паскаль. Указатели и векторные типы данных.
курсовая работа [233,5 K], добавлен 14.12.2012