Транслятор на языке Си для перевода текста программы с языка Паскаль на язык Си (операторы real, case, записи, указатель (на запись))
Последовательность работ при разработке объектно-ориентированных программ. Виды синтаксических анализаторов и способы их применения. Описание алгоритма и анализ результативности работы программы, написанной на языке С, ее константы, переменные и функции.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 03.07.2011 |
Размер файла | 441,7 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Государственное образовательное учреждение
высшего профессионального образования
«Северо-Кавказский государственный технический университет»
КУРСОВОЙ ПРОЕКТ
по дисциплине «Программирование на языке высокого уровня»
Вариант 13
Исполнитель:
Студент: Мишустина Юлия
группа АСОУ-091
Руководитель: Братченко Н.Ю.
Ставрополь
2010
Содержание:
Введение
1. Цели и задачи курсового проекта
2. Постановка задачи
3. Внешняя спецификация
4 . Описание алгоритма программы
5. Описание констант, переменных и функций программы
6. Листинг программы
7. Распечатка тестов и результатов
Выводы
Список используемой литературы
Введение
Объектно-ориентированное программирование - это новый способ подхода к программированию. Такое программирование, взяв лучшие черты структурного программирования, дополняет его новыми идеями, которые переводят в новое качество подход к созданию программ.
Концепция объектно-ориентированного программирования подразумевает, что основой управления процессом реализации программы является передача сообщений объектам. Поэтому объекты должны определяться совместно с сообщениями, на которые они должны реагировать при выполнении программы. В этом состоит главное отличие ООП от процедурного программирования, где отдельно определённые структуры данных передаются в процедуры (функции) в качестве параметров. Таким образом, объектно-ориентированная программа состоит из объектов - отдельных фрагментов кода, обрабатывающего данные, которые взаимодействуют друг с другом через определённые интерфейсы.
Объектно-ориентированный язык программирования должен обладать следующими свойствами:
- абстракции - формальное о качествах или свойствах предмета путем мысленного удаления некоторых частностей или материальных объектов;
- инкапсуляции - механизма, связывающего вмести код и данные, которыми он манипулирует, и защищающего их от внешних помех и некорректного использования;
- наследования - процесса, с помощью которого один объект приобретает свойства другого, т.е. поддерживается иерархической классификации;
- полиморфизма - свойства, позволяющего использовать один и тот же интерфейс для общего класса действий.
Разработка объектно-ориентированных программ состоит из следующих последовательных работ:
1. определение основных объектов, необходимых для решения данной задачи;
2. определение закрытых данных (данных состояния) для выбранных объектов;
3. определение второстепенных объектов и их закрытых данных;
4. определение иерархической системы классов, представляющих выбранные объекты;
5. определение ключевых сообщений, которые должны обрабатывать объекты каждого класса;
6. разработка последовательности выражений, которые позволяют решить поставленную задачу;
7. разработка методов, обрабатывающих каждое сообщение;
8. очистка проекта, то есть устранение всех вспомогательных промежуточных материалов, использовавшихся при проектировании;
9. кодирование, отладка, компоновка и тестирование.
Объектно-ориентированное программирование позволяет программисту моделировать объекты определённой предметной области путем программирования их содержания и поведения в пределах класса. Конструкция «класс» обеспечивает механизм инкапсуляции для реализации абстрактных типов данных. Инкапсуляция как бы скрывает и подробности внутренней реализации типов, и внешние операции и функции, допустимые для выполнения над объектами этого типа.
1. Цели и задачи курсового проекта
Цель данной курсовой работы: выработка у студентов практических навыков по проектированию программ, их отладке и документированию. Выполнение курсового проекта позволяет студенту закрепить полученные знания по дисциплине «Программирование на языке высокого уровня». Написание курсового проекта начинается с разработки технического задания (ТЗ) и завершается составлением отчета, в котором должно содержаться описание всей работы в целом.
2. Постановка задачи
Необходимо написать транслятор на языке Си для перевода текста программы с языка Паскаль на язык Си. Рассмотреть операторы real, case, записи, указатель (на запись).
Критерии:
- максимальная устойчивость от ошибок,
- учет некорректность вводимых данных.
- Вывод сведений о трансляции.
- максимальна эффективность
- Программа должна транслировать ранее набранный текст на языке Паскаль в текст на языке Си. При этом ввод имени файла производится через программу. При введении неверного имени предоставить возможность повторного ввода.
В программе нам так же необходимо использовать:
Арифметическое выражение ae2
3. Внешняя спецификация
При запуске программа спросит имя исходного файла (без расширения), если файл не найден, то запрос будет выполняться до тех пор, пока не будет введено имя существующего файла или до прекращения работы программы. Затем программа выполнит запрос об имени выходного файла и при наличии ошибок в тексте при трансляции выведет на экран номер исходящей строки, где найдена ошибка и саму ошибку. Далее выводится статистика о трансляции кода на экран.
Для запуска программы достаточно запустить откомпилированный файл Project.exe.
К аппаратным ограничения можно отнести процессор с частотой не менее 500 Гц, не менее 32М оперативной памяти.
В консоли после ввода пути и названия файла (разрешение может быть любым) пользователю будет выведено одно из двух возможных сообщений:
1. Об успешности операции.
2. Сообщение об ошибке.
В случае номер один запустится специальная подпрограмма обработки текста.
При случае номер два на экран будет выведено предложение повторного ввода названия файла.
Сообщение об ошибке для открытия файла:
К сожалению, файл не удалось открыть. Проверьте правильность имени и попробуйте еще раз.
Сообщение об ошибке для создания файла:
К сожалению, файл не удалось создать, возможно, файл с таким названием заблокирован. Попробуйте ввести другое имя.
4. Описание алгоритма программы
Существует два типа трансляторов: компиляторы и интерпретаторы. Компиляция включает в себя основные части: анализа и синтеза. Часть «анализ» компилятора разделяет исходную программу на составные части ее элементы (конструкции языка) и занимается промежуточным представлением исходного кода программы. Часть «синтеза» занимается тем, что из промежуточного представления (созданного при помощи части «анализ») создает новую программу на языке Си.
Исходное текстовое представление программы не очень пригодно для работы компилятора, поэтому во время анализа программа прежде всего разбивается на последовательность строк, или, как принято говорить, лексем. Множество лексем разбивается на непересекающиеся подмножества (лексические классы). Лексемы попадают в один лексический класс, если они неразличимы с точки зрения синтаксического анализатора. Например, во время синтаксического анализа все идентификаторы можно считать. Каждому подмножеству сопоставляется некоторое число, называемое идентификатором лексического класса (token) или лексическим классом.
5. Описание констант, переменных и функций программы
Константы
KWs[KWn] это массив ключевых слов, которые обрабатываются данной программой, их 19: "begin", "end", "var", "real", "boolean", "false", "true", "array", "while", "do", "type", "and", "or", *"case", * "assign", "read","write", "rewrite", "reset";
int inlen,outlen,inpos; - текущие позиции (строки входные, выходные, позиция в строке входной);
Переменные
int koper1,koper2,ker - эти переменные считают количество операторов во входном, выходном файле и кол-во ошибок;
int wlen; - длина "слова";
int wtype; - тип "слова";
int wnumf; - 0 - целое число, 1 - дробное;
int dt; -размер отступа (от начала строки);
Функция memcmp() сравнивает первые count символов массивов, адресуемых параметрами buf1 и buf2.
buf1 меньше buf2 = меньше нуля;
buf1 равен buf2 = 0;
buf1 больше buf2 = больше нуля;
void *memcpy(void *to, const void *from, size_t count);
Функция memcpy() копирует count символов из массива, адресуемого параметром from, в массив, адресуемый параметром to. Если заданные массивы перекрываются, поведение функции memcopy() не определено.
если gl - идентификатор глобальности = 1, то это глобальная переменнаяиначе локальная есть четыре типа переменных (описаны выше) конструкцию while можно расшифровать так: пока указатель на структуру p существует выполнять: если тип переменной -1 то присвоить ей заданный тип и далее шаг вперед.
wlen - длина анализуруемого слова;
*int memicmp (buf1, buf2, cnt);
char *buf1; первый буфер
char *buf2; второй буфер
unsigned cnt; количество символов
Функция memicmp лексикографически сравнивает первые cnt байтов из buf1 и buf2 вне зависимости от типа регистра, т.е. буквы верхнего и нижнего регистров считаются эквивалентными. Функция memicmp возвращает значение, указывающее соотношение buf1 и buf2,
а именно; Величина Значение
меньше 0 buf1 меньше, чем buf2
0 buf1 идентично buf2
больше 0 buf1 больше, чем buf2
char *strncpy (char *dst, const char *src, size_t len);
dst -- указатель на буфер назначения.
src -- указатель на исходную строку.
len -- максимальное количество копируемых символов (см. раздел Безопасность ниже).
Функция копирует из строки src в буфер dst не более чем len символов (включая нулевой символ), не гарантируя завершения строки нулевым символом (если длина строки src больше или равна len). Если длина строки src меньше len, то буфер добивается до len нулями. Функция возвращает значение dst.
int GetWordS() - получение слов, и если тип слова пробелы, запускает процедуру, пропускающую пробелы;
void inc_dt() - увеличение отступа;
void dec_dt() - уменьшение отступа;
void put_dt() - вывод отступа;
int GetText(char * s1) - открытие файла;
int PutText(char * s2) - вывод обработанного текста;
void ErrOp() - вывод ошибочного оператора;
int flabel(int gl) - проверка на комментарий;
void CommEnd() - проверка на закрытие комментария;
int fkW() - здесь идет проверка на ключевое слово, сравниваются полученное нами слово со словом из списка и если да, то возвращается номер слова в списке проверка на ключевое слово.
int fIntRealBoolAr(int svar, int gl) - обработка переменных после слова var, здесь идут обращения к тем четырем функциям работающим со списком переменных обработка описания переменных: x1,..,xn: тип;
int fvar(int gl) - обработка описания блока переменных;
int fvardescr() - обработка блока описания переменных;
int fwrite(int ln) - обработка оператора write;
int fae() - обработка арифметического выражения;
int fle() - обработка логического выражения;
int asign() - проверка на присваивание;
int frepeat() - обработка оператора repeat;
int fwhile() - обработка оператора while;
int fbegin(int gl) - обработка блока операторов;
int Translate() - главная функция преобразования текста
dst -- указатель на буфер назначения.
// src -- указатель на исходную строку.
// len -- максимальное количество копируемых символов
6. Листинг программы
#include <stdafx.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <locale.h>
FILE *file1, *file2;
const int buflen = 10000;
const int KWn = 15;
char * KWs[KWn] =
{ "begin", "end", "var", "real",
"boolean", "false", "true", /* "array", */
"while", "do", "type", "and",
"or", /*"case", */ "assign", /* "read",*/
"write", "rewrite", /*"reset"*/};
#define kw_begin 1
#define kw_end 2
#define kw_var 3
#define kw_real 4
#define kw_boolean 5
#define kw_false 6
#define kw_true 7
/*#define kw_array 8*/
#define kw_while 8
#define kw_do 9
#define kw_type 10
#define kw_and 11
#define kw_or 12
/*#define kw_case 14*/
#define kw_assign 13
/*#define kw_read 16*/
#define kw_write 14
#define kw_rewrite 15
/*#define kw_reset 19*/
#define t_Int 1 //целый
/*#define t_Real 2 //дробный*/
#define t_Bool 2 //логический
/*#define t_Array 4 //массив*/
#define t_File 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[buflen],
outstr[buflen];
int inlen,outlen,inpos;
int koper1,koper2,ker;
int wlen; //длина "слова"
int wtype; //тип "слова"
int wnumf; //0 - целое число, 1 - дробное
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 fle();
int addvar(int gl){
var *np, *p;
if (gl) p = vars; else p = lvars;
// int memcmp(const void *buf1, const void *buf2, size_t count);
while (p) {
if (strlen(p->s)==wlen&&
!memcmp(p->s,&instr[inpos],wlen)) return 0;
p = p->next; }
np = new var;
// void *memcpy(void *to, const void *from, size_t count);
memcpy(np->s,&instr[inpos],wlen);
np->s[wlen]=0;
np->tp = -1;
if (gl) {
np->next = vars;
vars = np;
} else {
np->next = lvars;
lvars = np; }
return 1;}
int addnewtype()
{types *head=typeslist, *ntype;
while (head) {
if (strlen(head->s)==wlen&&
!memcmp(head->s,&instr[inpos],wlen)) return 0;
head = head->next;}
ntype = new types;
memcpy(ntype->s,&instr[inpos],wlen);
ntype->s[wlen]=0;
ntype->tid = uvars;
uvars++;
ntype->next = typeslist;
typeslist = ntype;
return 1;}
void settype(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)==wlen&&
p = p->next; }
p = vars;
while (p) {
if (strlen(p->s)==wlen&&
!memcmp(p->s,&instr[inpos],wlen)) return p->tp;
p = p->next;}
return 0;}
char* usertype()
{ types * p;
// обработка локальных переменных
p = typeslist;
while (p) {
if (strlen(p->s)==wlen&&
!memcmp(p->s,&instr[inpos],wlen)) return p->s;
p = p->next;}
return "0";}
void freevars(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 GetWord()
{
int st = 0;
char c;
wlen = 0;
while (wlen+inpos<inlen ){
c = instr[inpos+wlen];
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=='\'' )
{ wlen = 1; return wtype = w_char; }
else { wlen = 0; return wtype = w_error; }
break;
case 1:
if (c==' ' || c=='\t' || c=='\n') wlen++;
else return wtype = w_space;
break;
case 2:
if ((c>='A' && c<='Z') ||
(c>='a' && c<='z') ||
(c>='0' && c<='9') ||
c=='_' ) wlen++;
else return wtype = w_str;
break;
case 3:
if (c>='0' && c<='9') wlen++; else
if (c=='.'&& instr[inpos+wlen+1]!='.') { //
wlen++;
st = 5;}
else{
wnumf = 0;
return wtype = w_numb; }
break;
case 5:
if (c>='0' && c<='9') wlen++; else {
wnumf = 1;
return wtype = w_numb;} }}
wlen = 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;
/*int memicmp (buf1, buf2, cnt);
return memicmp(m,s,l);}
void put_char(char c){
outstr[outlen] = c;
outlen++;}
void wcopy(){
memcpy(&outstr[outlen],&instr[inpos],wlen);
inpos += wlen;
outlen += wlen;}
int wequ(char * s){
return (!scmp(&instr[inpos],s,wlen));}
void wskip(){
inpos += wlen;}
void wstr(char * s){
// char *strncpy (char *dst, const char *src, size_t len);
strncpy(s,&instr[inpos],wlen);}
int GetWordS(){
GetWord();
if (wtype==w_space) {
wskip();
GetWord();}
return wtype;}
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 GetText(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>buflen) inlen = buflen;
inlen = fread(instr,1,inlen,file1);
instr[inlen] = 0;
inpos = 0;
outlen = 0;
return 1;}
int PutText(char * s2)
{
if ((file2 = fopen(s2, "wt")) == NULL){
return 0; }
fwrite(outstr,outlen,1,file2);
return 1;}
void ErrOp()
{
put_char('\n');
put_str("< Ошибка! > \n");
int k;
while (1){
GetWordS();
if (instr[inpos]== ';' || inpos>= inlen) {
wcopy();
break;};
wcopy();}
ker++; }
int flabel(int gl);
//проверка на комментарий
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 fkW(){
for (int i=0; i<KWn; i++){// просмотр всего массива KWn
if (!scmp(&instr[inpos],KWs[i],wlen))
return i+1;}
return 0;}
int fIntRealBoolAr(int svar, int gl){
char s[256];
int label;
int sp = 0;
GetWordS();
while (1){
if (wtype!=w_str||fkW()|| gl>0&&vartype() ) return 0;
addvar(gl);
if (svar) {
s[sp] = '&';
s[sp+1] = ' ';
sp += 2;}
memcpy(&s[sp],&instr[inpos],wlen);
inpos += wlen;
sp += wlen;
GetWordS();
if (instr[inpos]==','){
s[sp]=',';
inpos++;
sp++;
} else break;
GetWordS();
} // while(1)
if (instr[inpos]==':'){ //тип переменных
inpos++;
GetWordS();
if (wtype!=w_str) return 0;
if (!scmp(&instr[inpos],"boolean",wlen)){
settype(gl,t_Bool);
put_str("int ");
wskip();
memcpy(&outstr[outlen],&s[0],sp);
outlen += sp;}
else
/*if (!scmp(&instr[inpos],"real",wlen)){
settype(gl,t_Real);
put_str("float ");
wskip();
memcpy(&outstr[outlen],&s[0],sp);
outlen += sp;}
else*/
if (!scmp(&instr[inpos],"integer",wlen)){
settype(gl,t_Int);
put_str("int ");
wskip();
memcpy(&outstr[outlen],&s[0],sp);
outlen += sp;}
else
if (!scmp(&instr[inpos],usertype(),wlen)){
put_str(usertype());
put_str(" ");
wskip();
memcpy(&outstr[outlen],&s[0],sp);
outlen += sp;}
else
/* if (!scmp(&instr[inpos],"array",wlen)){
wskip();
settype(gl,t_Array);
GetWordS();
if (instr[inpos]!='[') return 0;
s[sp]='[';
inpos++;
sp++;
while (1) {
GetWordS();
if (instr[inpos]!='1') return 0;
wskip();
GetWordS();
if (instr[inpos]!='.'||instr[inpos+1]!='.')
return 0;
inpos += 2;
GetWordS();
if (wtype!=w_numb) return 0;
memcpy(&s[sp],&instr[inpos],wlen);
inpos += wlen;
sp += wlen;
GetWordS();
if (instr[inpos]==']'){
s[sp]=']';
inpos++;
sp++;
break;}
if (instr[inpos]==','){
inpos++;
s[sp]=']';
sp++;
s[sp]='[';
sp++;} }
GetWordS();
if (wtype!=w_str) return 0;
if (scmp(&instr[inpos],"of",wlen)) return 0;
wskip();
GetWordS();
if (wtype!=w_str) return 0;
if (scmp(&instr[inpos],"real",wlen)) return 0;
wskip();
put_str("float ");
memcpy(&outstr[outlen],&s[0],sp);
outlen += sp;
}*/
if(wequ("file"))
{
wskip();
GetWordS();
if(!wequ("of")) return 0;
wskip();
GetWordS();
put_str("FILE *");
memcpy(&outstr[outlen],&s[0],sp);
outlen += sp;
wskip();
settype(gl,t_File);}
}
else return 0;
return 1;}
int fvar(int gl){
inpos += wlen;
GetWordS();
do{
koper1++;
if (IsComment()){ //комментарии
CommEnd();
koper2++;
continue;}
put_dt();
if (!fIntRealBoolAr(0,gl)) ErrOp();
else koper2++;
GetWordS();
if (instr[inpos]!=';')
return 0;
wskip();
put_str(";\n");
GetWordS();
if (wtype!=w_str || fkW())
return 1;
}while(1);
}
int fvardescr(){
inpos += wlen;
int k,svar;
GetWordS();
do{
k = fkW();
svar = k==kw_var;
if (svar) {
wskip();
GetWordS();}
if (!fIntRealBoolAr(svar,0)) return 0;
GetWordS();
if (instr[inpos]!=';') return 1;
wskip();
put_str(", ");
GetWordS();
k= fkW();
if (wtype!=w_str || k&&k!=kw_var) return 0;
}while(1);}
int fbegin(int k);
wskip();
put_str("\nvoid ");
GetWordS();
if (wtype!=w_str||vartype()) return 0;
addvar(1);
settype(1,10);
wcopy();
GetWordS();
if (instr[inpos]!='(') return 0;
put_char('(');
if (!fvardescr()) return 0;
GetWordS();
if (instr[inpos]!=')') return 0;
wcopy();
GetWordS();
if (instr[inpos]!=';') return 0;
wskip();
put_str("\n{\n");
inc_dt();
//тело процедуры
int b;
do{
b = 1;
GetWordS();
if (!scmp(&instr[inpos],"var",wlen)){
koper1++;
if (!fvar(0)) return 0; }
else
if (!scmp(&instr[inpos],"begin",wlen)){
if (!fbegin(2)) return 0;
b = 0; }
else
if (IsComment()) CommEnd();
else return 0;
} while (b==1);
freevars(0);
inpos++;
return 1;}
int frecord(){
wskip();
put_str("struct ");
GetWordS();
if (wtype!=w_str || fkW()) return 0;
addnewtype();
wcopy();
GetWordS();
if (instr[inpos]!='=') return 0;
wskip();
GetWordS();
if (!wequ("record")) return 0;
put_str("\n{\n");
inc_dt();
if (!fvar(-1)) return 0;
dec_dt();
GetWordS();
if (!wequ("end")) return 0;
wskip();
put_char('}');
GetWordS();
if (instr[inpos]!=';') return 0;
wcopy();
put_str("\n\n");
inpos += wlen;
return 1;}
int fgoto()
{
wskip();
put_dt();
put_str("goto ");
GetWordS();
wcopy();
if (instr[inpos]!=';') return 0;
put_str(";\n");
inpos++;
//put_str("\n");
return 1;}
int fcase()
{
int beg;
wskip();
put_dt();
put_str("switch");
put_str("(");
GetWordS();
wcopy();
put_str("){\n");
GetWordS();
if (!wequ("of")) return 0;
wskip();
while(1)
{
GetWordS();
if (wequ("end")) {
wskip();
inpos++;
dec_dt();
put_dt();
put_str("}\n");
break;}
put_dt();
put_str("case ");
if ((wtype!=w_str)&&(wtype!=w_numb)&&(wtype!=w_char)) return 0;
if (instr[inpos]=='\'') {wskip(); put_str("\'");}
GetWordS();
wcopy();
if (instr[inpos]=='\'') {wskip(); put_str("\'");}
GetWordS();
if (instr[inpos]!=':') return 0;
wcopy();
GetWordS();
beg = 0; // по умолчанию ожидаем case 1: blabla;
if (wequ("begin")) {wskip(); beg = 1;};
put_str("\n");
inc_dt();
fbegin(3); // 3 - означает обработку case
dec_dt();
if (wequ("end")&&beg)
{put_dt();
put_str("break;\n");
wskip();
if(instr[inpos]==';') inpos++;
} else { put_dt(); put_str("break;\n");}}
return 1;}
int frewrite()
{
wskip();
if (instr[inpos]!='(') return 0;
inpos++;
put_dt();
put_str("fcreate(");
GetWordS();
if(vartype()!=t_File) return 0;
wcopy();
if (instr[inpos]!=')') return 0;
inpos++;
put_str(")");
if (instr[inpos]!=';') return 0;
inpos++;
put_str(";\n");
return 1;}
/*int freset()
{
wskip();
if (instr[inpos]!='(') return 0;
inpos++;
GetWordS();
wskip();
if (instr[inpos]!=')') return 0;
inpos++;
if (instr[inpos]!=';') return 0;
inpos++;
return 1;}
int fassign()
{
int t;
wskip();
if (instr[inpos]!='(') return 0;
inpos++;
GetWordS();
if(t = vartype())
{
if(t==t_File)
{
put_dt();
wcopy();
put_str(" = fopen(\"");
if(instr[inpos]!=',') return 0;
inpos+=2;
while (instr[inpos]!= '\'')
{
outstr[outlen] = instr[inpos];
inpos++;
outlen++;}
inpos++;
put_str("\"");
put_str(",\"w\"");
GetWordS();
if (instr[inpos]!=')') return 0;
inpos++;
put_str(")");
if (instr[inpos]!=';') return 0;
inpos++;
put_str(";\n");
return 1;} }
return 1;}
/*int fif()
{
wskip();
put_dt();
put_str("if (");
if (!fle()) return 0;
put_str(")\n");
GetWordS();
if(wequ("then")) wskip();
else return 0;
return 1;}
int felse()
{
wskip();
put_dt();
put_str(" else\n");
return 1;}*/
/*int fnew()
{
wskip();
put_dt();
inpos++;
GetWordS();
switch(vartype())
{
case t_Int:
wcopy();
put_str(" = new(int);\n");
inpos++;
if (instr[inpos]!=';') return 0;
inpos++;
break;
case t_Real:
wcopy();
put_str(" = new(float);\n");
inpos++;
if (instr[inpos]!=';') return 0;
inpos++;
break;
default: return 0;}
return 1;
}*/
/*int fdispose()
{
wskip();
put_dt();
if (instr[inpos]!='(') return 0;
put_str("delete ");
inpos++;
GetWordS();
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();
GetWordS();
if (instr[inpos]!='(') return 0;
inpos++;
GetWordS();
if(t = vartype())
{
if(t==t_File)
{
put_str("fscanf(");
wcopy();
if(instr[inpos]!=',') return 0;
inpos++;
put_str(",");
while (instr[inpos]!= ')')
{
outstr[outlen] = instr[inpos];
inpos++;
outlen++;
}
GetWordS();
if (instr[inpos]!=')') return 0;
inpos++;
put_str(")");
if (instr[inpos]!=';') return 0;
inpos++;
put_str(";\n");
return 1;}}
put_str("scanf");
put_str("(\"");
sp=0;
while (1) {
GetWordS();
if (wtype!=w_str) return 0;
t = vartype();
if (t==t_Int) put_str("%d");
else if (t==t_Real) put_str("%f");
else return 0;
s[sp] = '&';
sp += wlen;
GetWordS();
memcpy(&s[sp],&instr[inpos],wlen);
inpos += wlen;
sp += wlen;
GetWordS();
if (instr[inpos]!=',') break;
s[sp] = instr[inpos];
inpos++;
sp++;
}
put_str("\",");
memcpy(&outstr[outlen],s,sp);
outlen += sp;
GetWordS();
if (instr[inpos]!=')') return 0;
inpos++;
put_char(')');
GetWordS();
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();
GetWordS();
if (instr[inpos]!='(') return 0;
inpos++;
/* Обработка файла */
GetWordS();
if(t = vartype())
{
if(t==t_File)
{
put_str("fprintf(");
wcopy();
if(instr[inpos]!=',') return 0;
inpos+=2;
put_str(",\"");
while (instr[inpos]!= '\'')
{
outstr[outlen] = instr[inpos];
inpos++;
outlen++;
}
inpos++;
put_str("\"");
GetWordS();
if (instr[inpos]!=')') return 0;
inpos++;
put_str(")");
if (instr[inpos]!=';') return 0;
inpos++;
put_str(";\n");
return 1;}
put_str("printf");
put_char('(');
GetWordS();
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) {
GetWordS();
if (wtype!=w_str) return 0;
t = vartype();
if (t==t_Int) put_str("%d");
/*else if (t==t_Real) put_str("%f");*/
else return 0;
memcpy(&s[sp],&instr[inpos],wlen);
inpos += wlen;
sp += wlen;
GetWordS();
if (instr[inpos]!=',') break;
s[sp] = instr[inpos];
inpos++;
sp++;}
if (ln) put_str("\\n");
put_char('"');
GetWordS();
put_str("\,");
memcpy(&outstr[outlen],s,sp);
outlen += sp;
GetWordS();
if (instr[inpos]!=')') return 0;
inpos++;
put_char(')');
GetWordS();
if (instr[inpos]!=';') return 0;
inpos++;
put_str(";\n");
return 1;}
int fae() {
GetWordS();
if (instr[inpos]=='+'){
wcopy(); }
else
if (instr[inpos]=='-'){
wcopy();}
while (1){
GetWordS();
if (wtype==w_numb) wcopy(); else
if (wtype==w_str&&vartype()==t_Int) wcopy(); /*else
if (wtype==w_str&&vartype()==t_Real) wcopy(); else
if (wtype==w_str&&vartype()==t_Array) {
wcopy();
GetWordS();
if (instr[inpos]=='['){
wcopy();
while (1) {
if (!fae()) return 0;
put_str("-1");
GetWordS();
if (instr[inpos]==']'){
wcopy();
break; }
if (instr[inpos]==','){
wskip();
put_str("]["); } }
}
} else
if (instr[inpos]=='('){
wcopy();
if (!fae()) return 0;
GetWordS();
if (instr[inpos]!=')') return 0;
inpos++;
put_char(')');
}*/
else return 0;
GetWordS();
char c = instr[inpos];
if (c=='+'||c=='-'||c=='*'||c=='/') wcopy();
else return 1;}
}
int ae(){
char c,c1;
if (!fae()) return 0;
GetWordS();
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();}
GetWordS();
if (!fae()) return 0;
return 1;
}
int fle() {
int k;
char c,c1;
int arifm, ip,op;
while (1){
GetWordS();
k = fkW();
int ip, op;
ip = inpos;
op = outlen;
arifm = 0;
if(instr[inpos]=='+'||
instr[inpos]=='('||
instr[inpos]=='-'||
wtype==w_str&&!fkW() ||
wtype==w_numb)
arifm = ae();
if (!arifm){
inpos = ip;
outlen = op;
GetWordS();
k = fkW();
if (wtype==w_str&&k==kw_true){
wskip();
put_char('1');}
else
if (wtype==w_str&&k==kw_false) {
wskip();
put_char('0');}
else
if (wtype==w_str&&vartype()==t_Bool) wcopy(); else
if (instr[inpos]=='('){
wcopy();
if (!fle()) return 0;
GetWordS();
if (instr[inpos]!=')') return 0;
inpos++;
put_char(')');}
else return 0; }
GetWordS();
k = fkW();
if (k==kw_or) put_str("||"); else
if (k==kw_and) put_str("&&");
else return 1;
wskip();}}
int asign(){
int type = vartype();
if (!(type==t_Bool||/*type==t_Real||*/type==t_Int)) return 0;
//put_char('\n');
put_dt();
wcopy();
GetWordS();
if (instr[inpos]!=':'||instr[inpos+1]!='=')
return 0;
put_char('=');
inpos += 2;
if (type==t_Bool) {
if (!fle()) return 0; }
else
if (!fae()) return 0;
GetWordS();
if (instr[inpos]!=';') return 0;
wcopy();
put_char('\n');
return 1;}
/*int frepeat() {
wskip();
put_dt();
put_str("do {\n");
inc_dt();
return 1;}
int funtil() {
wskip();
dec_dt();
put_dt();
put_str("} while (");
if (!fle()) return 0;
put_char(')');
GetWordS();
if (instr[inpos]!=';') return 0;
inpos++;
put_str(";\n");
return 1;}*/
int fwhile() {
wskip();
put_dt();
put_str("while (");
if (!fle()) return 0;
GetWordS();
if (wtype!=w_str||fkW()!=kw_do) return 0;
wskip();
put_str(")\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;
GetWordS();
if (IsComment()){
CommEnd();
continue; }
switch(fkW()){
case kw_begin:
koper1++;
if (!fbegin(0)) return 0;
koper2++;
break;
/*case kw_case:
koper1++;
if (!fcase()) return 0;
break;*/
/*case kw_read:
koper1++;
if (!fread(0)) return 0;
koper2++;
break;*/
case kw_write:
koper1++;
if (!fwrite(0)) return 0;
koper2++;
break;
case kw_rewrite:
koper1++;
if (!frewrite()) return 0;
koper2++;
break;
/*case kw_reset:
koper1++;
if (!freset()) return 0;
koper2++;
break;*/
case kw_assign:
koper1++;
if (!fassign()) return 0;
koper2++;
break;
case kw_while:
koper1++;
if (!fwhile()) return 0;
koper2++;
break;
case kw_end:
koper1++;
if(gl == 3) return 3;
wskip();
dec_dt();
put_dt();
put_str("}\n");
GetWordS();
if (gl==1&&instr[inpos]=='.' ||
gl!=1&&instr[inpos]==';'){
wskip();
koper2++;
return 1;}
else
{
wskip();
return 0;}
case 0:
if (!asign()) return 0; //присваивание
break;
default:
return 0; }
} while (b);
return 1;}
int Translate()
{
int b;
int k;
koper1 = koper2 = 0;
put_str("#include <stdio.h>\n\n"); //для scanf и printf
do{
b = 1;
GetWordS();
k = fkW(); //проверка на ключевое слово
if (k==kw_var){ //начало блока переменных
koper1++;
if (!fvar(1)) {
ErrOp();}
else koper2++; }
else
if (k==kw_type){ koper1++;
if (!frecord()) {
ErrOp(); }
else koper2++;}
else
if (k==kw_begin){
if (!fbegin(1)) {
ErrOp();}
b = 0;}
else
if (IsComment()) CommEnd(); //комментарии
else {
koper1++;
ErrOp(); };
} 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 (!GetText(s))
{
printf("\nОшибка открытия файла!"); }
vars = NULL;
lvars = NULL;
uvars = cuservars;
Translate();
freevars(1);
printf("\nВведите имя выходного файла:");
scanf("%s",s);
if (!PutText(s))
{
printf("\nОшибка создания файла!"); }
printf("\nКоличество операторов"
" в исходном файле: %d", koper1);
printf("\nКоличество операторов"
" в полученном файле: %d", koper2);
printf("\nКоличество ошибочных операторов"
" которые не были обработаны: %d", ker);
printf("\n\nРезультат хранится в файле: %s",s);
fclose(file1);
fclose(file2);
while (!kbhit()) ;
}
7. Распечатка тестов и результатов
Для начала проверим программу на правильную обработку ошибочного ввода входного файла, для этого введем имя несуществующего файла:
программа алгоритм объектный ориентированный константа
Рисунок 7.1 - Вид экрана при вводе имени несуществующего файла
Рисунок 7.2 - Вид экрана при обработке файла firstfile
Рисунок 7.3 - Экран программы при обработке программы secondfile
Комментарий к полученным результатам:
Для исходного текста, в котором были записаны только определенные по заданию операторы, трансляция прошла успешно. При добавлении ошибочного оператора, трансляция выполнялась только до момента нахождения этой ошибки.
Выводы
Мы приобрели навыки написания однопроходных трансляторов, в данном задании нам требовалось создать довольно простой транслятор, однако на этом примере были видны все фазы обработки файла исходного текста программы. Мы так же изучили основные виды синтаксических анализаторов и способы их применения, а так же узнали принципы работы таких программ. Обладая знаниями языка ассемблер уже можно попробовать написать свой компилятор. Однако некоторые тонкости построения компиляторов были упущены, что бы упростить программу. Сегодня любой компилятор это сложная программа, заточенная обычно под определенный язык, осуществляющая не только анализ и транслирование текста в машинные коды, но так же и оптимизацию.
Литература:
Дискретная математика, конспект лекций. В.Г. Засовенко. Запорожье, 1998 г.
Начальный курс С и С++. Б.И. Березин. Москва: "ДИАЛОГ-МИФИ", 1999 г.
Язык программирования С++. Б. Страуструп. Киев:"ДиаСофт", 1993г.
А. Ахо, Р.С. (2001). Компиляторы: принципы, технологии и инструменты. Москва: Вильямс.
Размещено на Allbest.ru
Подобные документы
Создание программы для перевода кодов с языка Pascal на язык Си. Обработка программ операторами case, assign, rewrite и write. Способы объявления файла, комментария, переменных, логических и арифметических выражений. Виды синтаксических анализаторов.
курсовая работа [461,0 K], добавлен 03.07.2011Создание транслятора, обрабатывающего код программы на языке Паскаль и за счет эквивалентных операторов генерирующего программу на Си. Особенности внешней спецификации и работы лексического анализатора. Структура программы, вывод результатов на экран.
курсовая работа [254,0 K], добавлен 02.07.2011Выбор метода проектирования транслятора с языка Паскаль на язык Си, разработка и кодирование алгоритма программы. Использование допустимых операторов в исходном тексте, определение типов переменных и синтаксиса логических и арифметических выражений.
курсовая работа [1,0 M], добавлен 03.07.2011Создание приложения, исполняющего трансляцию программы из языка Паскаль в язык Си: разработка алгоритма реализации задачи, описание необходимых констант, переменных, функций и операторов, представление листинга программы и распечатка результатов.
курсовая работа [305,9 K], добавлен 03.07.2011Написание транслятора посредством языка Си, обрабатывающего конструкции integer, if Le then, записи (record), а также реализующего обработку new для выделения динамической памяти: разработка алгоритма реализации задачи, представление листинга программы.
курсовая работа [171,7 K], добавлен 03.07.2011Язык программирования Турбо Паскаль. Запись алгоритма на языке программирования и отладка программы. Правила записи арифметических выражений. Стандартное расширение имени файла, созданного системным редактором. Составной оператор и вложенные условия.
курсовая работа [75,0 K], добавлен 21.03.2013Схема разбора арифметического и логического выражения. Внешняя спецификация конвертора и алгоритм перевода программ на языке Паскаль в текст на языке Си. Назначение подпрограмм, особенности констант и переменных. Код программы и ее тестирование.
курсовая работа [567,5 K], добавлен 03.07.2011Программный комплекс для разработки программы транслирующей программу с языка Pascal на язык С++. Построение логической и арифметической модели решения. Разработка компилятора для программы. Методы отладки программы и создание для нее документации.
курсовая работа [742,6 K], добавлен 03.07.2011Написaние прoграммы, выполняющей трансляцию с языка программирования Пaскaль нa язык прoгрaммирoвaния Си и транслирующей конструкции, такие кaк integer, repeat … until Le, procedure, type, record для type. Обработка арифметических и логических выражений.
курсовая работа [314,3 K], добавлен 03.07.2011Общая характеристика языков программирования. Описание языка Паскаль: основные субъекты языка; структура Паскаль-программы; типизация и объявление данных. Операторы присваивания и выражения. Структурные операторы, организация ветвлений и циклов.
дипломная работа [276,6 K], добавлен 26.01.2011