Содержание
Задача 1
Исходные данные:
1. Записать на языке Паскаль выражение: y=e | sin(x-y) |
2. Вычислить значение выражения и определить его тип: succ(round(1.2))
3. Определить тип выражения: abs(5.0)
Задача 2
Исходные данные:
Составить программу вычисления выражения
Задача 3
Исходные данные:
Вычислить выражение:
Задача 4
Исходные данные:
Найти ошибки в следующем фрагменте программы:
k:=1;
for j:=1 to 12 do begin j:=j+3; k:=k+j end;
Выдержка из текста работы
- 1. Описание задания для курсового проекта
- 2. Постановка задачи
- 3. Выбор метода решения
- 4. Описание функций и переменных транслятора
- 5. Разработка алгоритма
- 6. Кодирование алгоритма программы транслятора на языке Си++
- 7. Распечатка тестов и результатов
- Выводы
- Список использованной литературы
1. Описание задания для курсового проекта
Цель: спроектировать транслятор с языка Паскаль на язык Си, произвести отладку и документирование данного проекта.
Данная цель дает возможность использовать знания дисциплины «Программирование на языке высокого уровня».
Курсовая работа включает в себя ступени выполнения с разработки технического задания и заканчивается описанием проделанной работы в отчете.
Тема: «Разработка конвертора на языке Си для перевода программ на языке Паскаль в текст программы на языке Си».
По заданию на данный проект нужно: составить транслятор на языке Си для перевода программ с языка Паскаль в текст программы на языке Си.
Допустимые операторы в исходном тексте, типы переменных, определяются по вариантам.
— должны быть приведены синтаксические диаграммы для данных операторов, в соответствии с которыми будет производиться анализ операторов исходного текста и их конвертирование (по согласованию с преподавателем синтаксис некоторых сложных операторов может быть упрощен);
-должны быть описаны возможные и обязательные использования пробелов в исходном тексте;
-исходные данные и результат хранятся в текстовых файлах, их имена должны запрашиваются транслятором;
— если обнаружена синтаксическая ошибка оператора: в выходной файл вносится комментарий об ошибке;
— обработка отдельных операторов описываются как подпрограммы;
-оформить вывод комментарий из исходного файла в выходной;
— ключевые слова операторов в программе на языке Си записываются только строчными буквами, а в программе на языке Паскаль они могут быть записаны и строчными и прописными;
— в виде идентификаторов используются любые буквы;
-в одной строке исходного текста может быть записано несколько операторов или только часть одного оператора.
Так же нужно учитывать, что при формировании текста можно не использовать правило отступа.
Название задачи
Решаемой задачей на данный курсовой проект является создание компилятора, транслирующего исходный файл, с текстом на зыке Паскаль в выходной файл с текстом на языке Си, включающий в себя перевод обозначенных заданием операторов, комментарий, типа переменных и обозначения всех ошибочных операторов.
Данная задача актуальна из-за некоторых проблем, связанных с использованием разных языков программирования для написания программ, как например Delphi или Паскаль. Для людей знающих всего несколько языков, не включающих выше перечисленные, данная проблема будет стоять особенно остро. Язык Си и Си++ на наше время являются наиболее известными, поэтому именно этот язык мы используем для трансляции заданной программы. Кроме того, язык Си и Си++ так же наиболее эффективный и перевод программ именно на этот язык упрощает роботу с программой. Транслятор дает возможность обеспечить более дешевую разработку программы без затраты в дальнейшем на человеческие ресурсы.
Описание
Данная программа включается в себя использование исходных данных, которые подразумевают под собой текст с программой на языке Паскаль, включающий: операторы, заданные вариантом и являющиеся по определению ошибочными, комментарии, которые будут выводиться в выходной файл, описание типов переменных, подпрограмм и иных структур.
Сама программа будет реализовывать транслирование по типу:
— чтение из исходного файла — весь файл представляет собой одну большую символьную строку, с которой мы будем работать в дальнейшем;
-проверка строки на ключевые слова, описанные как массив ключевых слов;
-проверка на функции;
-проверка на операторы;
-проверка на комментарии;
-вывод текста в выходной файл: число операторов в исходной программе, число операторов в полученной программе, число ошибочных операторов в полученной программе.
Адрес исходного и выходного файла вводятся пользователем с клавиатуры.
Входная информация
По заданному условию путь к исходным данным задает пользователь. Файл будет иметь формат текста (txt), однако разрешение файла указывать не обязательно.
Заданный адрес будет обрабатываться программой и при указании несуществующего файла — выдается сообщение об ошибке. Программа не продолжает работу.
printf(«Имя исходного файла:»);
scanf(«%s»,s);
где s- массив типа char.
Выходная информация
Данные будут записываться в выходной файл, который задает пользователь в начале работы программы. Файл имеет текстовое расширение и содержит:
-модуль #include <stdio.h>- как статичный элемент разработки программ;
-название программы;
— сообщения об ошибках на месте неопознанных операторов;
-определенные по условию операторы (for, type,function);
-переменные типа integer;
-арифметические конструкции;
-логические конструкции;
-объявление главной программы;
-замену begin, end на {,};
-присутствующие в исходном файле комментарии.
Пробелами в выходном файле пренебрегли.
К выходным данным так же будут относится, данные выдающиеся на экран, описанные функцией:
printf(«\nКоличество операторов»
» в исходной программе: %d», koper1);
printf(«\nКоличество операторов»
» в полученной программе: %d», koper2);
printf(«\nКоличество ошибочных операторов»
» в полученной программе: %d», ker);
printf(«\n\nФайл с результатом: %s»,s);
где:
koper1 -количество операторов в исходном файле
koper2 — количество операторов в выходном файле
ker — количество ошибок
s -имя выходного файла
Ошибки
При работе с данной программой пользователь может совершить ошибки: — неправильное имя исходного файла:
printf(«Имя исходного файла:»);
scanf(«%s»,s);
if (!GetText(s))
{ printf(«\nОшибка открытия файла!»); }
— неправильное имя входного файла:
printf(«\nИмя выходного файла:»);
scanf(«%s»,s);
if (!PutText(s))
{ printf(«\nОшибка создания файла!»);
В обоих случаях происходит выход из программы. Повторный ввод данных возможен только при новом запуске программы.
Данный этап включает в себя описания логической и математической модели решения задачи, и словесное описание модели в виде плана действий.
Опишем логическую и математическую модель получения данных, использованные в курсовой работе. В данных моделях, описанных графически, принимается, что синтаксические диаграммы одинаковы для языков Паскаль и Си.
Пусть мы имеем некое выражение Le2, проверим его по нашей логической модели получения данных:
1. Проверка является ли выражение Le2 слагаемым (OR), если да, то выход;
2. Проверка является ли вы выражение Le2 множителем (AND) если да, то выход;
3. Проверка является ли выражение Le2: константой, переменной или арифметическим выражением;
4. Если Le2 арифметическое выражение — проверка на арифметическое выражение: проверяем на арифметические операции (=, <>, >, >=, <=, <). Выход;
5. Если Le2 переменная, проверяем тип переменной. Если он не определен, то заключаем его в квадратные скобки и выход. Иначе — выход;
6. Если Le2 константа проверяем ее значение, выход.
Пусть мы имеем некое выражение Ae1, проверим его по нашей математической модели получения данных:
1. Если выражение операнд, то смотрим тип операции после него (+, *, /, -);
2. Проверяем тип операнда: целый или переменная;
3. Если это переменная, то проверяем, буква ли это, если это так то заключаем ее в квадратные скобки, выход.
Нарисуем структуру программы:
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. ffunction -обработка функций
25. frecord — обработка оператора record
26. ob_arif — обработка арифметического выражения
27. ob_arifmetich -обработка арифметического выражения
28. ob_logich -обработка логического выражения
29. asign -проверка на присваивание
30. ffor -обработка оператора for
31. Konvektor -главная функция преобразования текста
32. Main — основная программа
Начало
Ввод адреса исходного файла
Проверка: если адрес не правильный, то ошибка
Ввод адреса выходного файла
Проверка: если адрес не правильный, то ошибка
Начало
Проверка на ключевое слово fkW
Начало блока переменных
Проверка на ошибки ключевых слов
Блок описания типов
Начало
Анализ длинны слова
Оставленный нами текст программы на языке Си++ будет иметь вид:
#include «stdafx.h»
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <locale.h>
FILE *file1, *file2;
const int buob_logichn = 10000;
const int cuservars = 6;
int uvars;
outstr[buob_logichn];
types * typeslist;
int ob_logich();
int ob_arif();
int asign();
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)
head = head->next;
return 0;
char* utname(int number)
types *head=typeslist;
while(head)
head = head->next;
return 0;
return 0;
char* usertype()
int Analiz()
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
{ slen = 1; return stype = w_char; }
else { slen = 0; return stype = w_error; }
case 1:
if (c==’ ‘ || c==’\t’ || c==’\n’) slen++;
case 2:
) slen++;
else return stype = w_str;
case 3:
if (c>=’0′ && c<=’9′) slen++; else
st = 5;
return stype = w_numb;
case 5:
return stype = w_numb;
return 0;
outlen += l;
return memicmp(m,s,l);
outlen++;
outlen += slen;
return (!scmp(&instr[inpos],s,slen));
inpos += slen;
strncpy(s,&instr[inpos],slen);
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()
int openText(char * s1)
return 1;
int vvodText(char * s2)
return 1;
void Oshibka()
instr[inpos]=='(‘ ||instr[inpos+1]==’*’);
put_char(‘\n’);
return 0;
if (!scmp(&instr[inpos],usertype(),slen)){
put_str(usertype());
put_str(» «);
wskip();
memcpy(&outstr[outlen],&s[0],sp);
if (!scmp(&instr[inpos],»^»,slen)){
wskip();
AnalizS();
newtypew(gl,uvart());
wcopy();
put_str(» * «);
memcpy(&outstr[outlen],&s[0],sp);
return 1;
}while(1);
}while(1);
int fbegin(int k);
return 1;
return 1;
int ffor()
char tvar[32],*tint;
int tdt=dt;
wskip();
AnalizS();
memcpy(tvar,&instr[inpos],slen);
tvar[slen] = 0;
put_dt();
dt = 0;
put_str(«for(«);
if (!asign()) return 0;
put_str(«;»);
if(wequ(«to»)) tint = «++)»;
if(wequ(«downto»)) tint = «—)»;
wskip();
put_str(tvar);
AnalizS();
put_str(«<=»);
if(!ob_logich()) {
put_str(tvar);
wcopy();
put_str(«;»);
AnalizS();
put_str(tint);
put_str(«\n»);
wskip();
dt = tdt;
return 1;
return 1;
if (ln) put_str(«\\n»);
put_char(‘)’);
inpos++;
if (instr[inpos]!=’;’) return 0;
inpos++;
put_str(«;\n»);
return 1;
stype==w_numb)
if (!arifm){
inpos = ip;
outlen = op;
AnalizS();
return 1;
case kw_begin:
kol1++;
if (!fbegin(0)) return 0;
kol2++;
case kw_write:
kol1++;
if (!fwrite(0)) return 0;
kol2++;
case kw_writeln:
kol1++;
if (!fwrite(1)) return 0;
kol2++;
case kw_read:
kol1++;
if (!fread(0)) return 0;
kol2++;
case kw_readln:
kol1++;
if (!fread(1)) return 0;
kol2++;
case kw_for:
kol1++;
if (!ffor()) return 0;
kol2++;
case kw_function:
if (!ffunction()) return 0;
case kw_end:
kol1++;
if(gl == 3) return 3;
wskip();
dec_dt();
put_dt();
put_str(«}\n»);
AnalizS();
return 1;
else
return 0;
case 0:
default:
return 1;
int Konvektor()
return 1;
void main()
while (!kbhit()) ;
Проведем несколько тестов на анализ работоспособности получившейся программы:
{объявление переменных}
end;
(*начало функции*)
function pr(k: integer);
begin
Запустим компилятор и получим результат:
#include <stdio.h>
int k,s,a,i,l;
/*объявление переменных*/
/*начало функции*/
for(
end;
function pr(k: integer);
begin
readln(k);
begin
write (‘введите количество чисел числа ‘,s);
end.
Запустим компилятор и получим результат:
#include <stdio.h>
int k,s,a,i,l;
/*объявление переменных*/
struct rec
int x,y;
/*начало функции*/
void pr(int k)
{объявление переменных}
end;
function pr(k: integer);
begin
bedin
readln(k);
l=l+1;
begin
write (‘введите количество чисел числа ‘,s);
Запустим компилятор и получим результат:
#include <stdio.h>
int k,s,a,i,l;
/*объявление переменных*/
struct rec
int x,y;
/*начало функции*/
void pr(int k)
while(l!=2)dobedinfori:=1to2doreadln(k);
l=l+1;
end;
end;
В процессе выполнения данной курсовой работы мы закрепили знания по дисциплине «Программирование на языке высокого уровня». Улучшили знания работы с файлами, циклами, динамической памятью, структурами, рекурсией, процедурами и функциями.
В курсовой работе разработана программа, позволяющая частично транслировать с языка Паскаль на язык Си некоторые функции, обрабатывать комментарии, целочисленный тип переменных, начало и конец цикла, а так же определять логические и арифметические выражения.