УНИВЕРСИТЕТ\n\n\r");
cprintf(" КАФЕДРА АСУ\n\n\r");
cprintf(" Курсовая работа по системному программированию на тему:\n\r");
cprintf(" \"Арифметический оператор условного перехода языка FORTRAN\".\n\n\r");
cprintf(" Студента группы А-513\n\n\r");
cprintf(" Бойко Константина Анатольевича.\n\n\r");
cprintf("В программе использованы клавиши:\n\r");
cprintf(" F1 - данный Help.\n\r");
cprintf(" F2 - грамматика языка.\n\r");
cprintf(" F3 - язык оператора.\n\r");
cprintf(" F4 - компиляция файла.\n\r");
cprintf(" ESC - выход из программы.\n\n\r");
cprintf(" Для выхода из Help нажмите любую клавишу.");
getch();
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Грамматика.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Grammar(void)
{
window(10,2,70,23);
textattr(46);
clrscr();
Windows(10,2,70,23,"Grammar");
window(12,4,68,22);
cprintf(" 1. <Оператор> -> IF(<АВ>)<LABEL>,<LABEL>,<LABEL>\n\r");
cprintf(" 2. <LABEL> -> <ЦБЗ>\n\r");
cprintf(" 3. <АВ> -> T | <АВ>+T | <АВ>-T\n\r");
cprintf(" 4. T -> O | T*O | T/O | T**O\n\r");
cprintf(" 5. O -> (<АВ>) | <Идентификатор> | <ЧПЗ>\n\r");
cprintf(" 6. <Идентификатор> -> Б{Б|Ц}\n\r");
cprintf(" 7. <ЦБЗ> -> Ц{Ц}\n\r");
cprintf(" 8. <ЧПЗ> -> Ц{Ц}[.Ц{Ц}]\n\n\r");
cprintf(" Условные обозначения:\n\r");
cprintf(" T - терм.\n\r");
cprintf(" O - операнд.\n\r");
cprintf(" Б - буква.\n\r");
cprintf(" Ц - цифра.\n\r");
cprintf(" ЦБЗ - целое без знака.\n\r");
cprintf(" ЧПЗ - число с плавающей запятой.\n\r");
cprintf(" ** - возведение в степень.\n\r");
cprintf(" <LABEL> - метка.\n\r");
cprintf(" <АВ> - арифметическое выражение.");
getch();
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Язык.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Language(void)
{
window(20,7,60,17);
textattr(62);
clrscr();
Windows(20,7,60,17,"Language");
window(22,9,58,16);
cprintf(" IF(<АВ>) LABEL1,LABEL2,LABEL3\n\n\r");
cprintf(" АВ - Арифметическое Выражение.\n\r");
cprintf(" LABEL1,LABEL2,LABEL3 - первая,вторая и третья метки соответственно.\n\r");
getch();
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Компиляция программы.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Compile(void)
{
window(20,7,55,13);
textattr(94);
clrscr();
Windows(20,7,55,13,"Compile");
window(22,8,58,16);
gotoxy(1,1);
if(com!=0)
{
cprintf("\n\n Файл откомпилирован!");
Beep(900,1000);
return;
}
cputs("\n Идет компиляция файла.\r\n\n Пожалуйста, подождите...");
#ifdef TEST
window(1,1,80,25);
clrscr();
#endif
for(int i=0;file1[i][0]!=NULL;i++)
{
Operator(file1[i]);
if(l!=3 && l!=0)
Error(11);
e1++;
e2=0;
}
com++;
delay(300);
Beep(1000,200);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Оператор.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Operator(char* str)
{
pos=2;
l=0;
string[0]=NULL;
strcpy(string,str);
string[strlen(string)-1]=NULL;
char temp[3];
temp[0]=str[0];
temp[1]=str[1];
temp[2]=NULL;
#ifdef TEST
puts(string);
puts(temp);
getch();
#endif
fprintf(fl," ¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾\n");
fprintf(fl,"%s\n",string);
if(strcmp(temp,"IF")!=0)
{
#ifdef TEST
printf("Не найден оператор IF.\n");
#endif
Error(10);
return;
}
Scan();
if(nx==' ')
Scan();
if(nx!='(')
Error(7);
if(nx==NULL)
{
Error(12);
Error(9);
return;
}
AB();
while(nx!=')' && nx!=NULL && nx!=' ')
Scan();
if(nx!=')')
Error(3);
if(nx==NULL)
{
Error(9);
return;
}
Scan();
if(nx==NULL)
{
Error(9);
return;
}
if(nx==' ')
Scan();
Label();
if(nx!=',')
{
Error(5);
Scan();
}
else
Scan();
if(nx==NULL)
return;
Label();
if(nx!=',')
{
Error(5);
Scan();
}
else
Scan();
if(nx==NULL)
return;
Label();
if(nx!=NULL)
{
Error(6);
Scan();
}
return;
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Scan.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Scan(void)
{
nx=string[pos++];
#ifdef TEST
printf("Текущий символ %c - %d.\n",nx,nx);
#endif
fprintf(fl,"Текущий символ %c - %d.\n",nx,nx);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Метка.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Label(void)
{
if(ABS() == NO)
{
Error(8);
Scan();
}
else
l++;
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Целое Без Знака.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int ABS(void)
{
#ifdef TEST
cprintf("ABS - проверка на Целое Без Знака с цифры %c.\r\n",nx);
#endif
fprintf(fl,"ABS - проверка на Целое Без Знака с цифры %c.\n",nx);
if(isdigit(nx))
{
while(isdigit(nx))
Scan();
return(YES);
}
return(NO);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Арифметическое Выражение.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int AB(void)
{
#ifdef TEST
cprintf("AB - Проверка на Арифметическое Выражение.\r\n");
#endif
fprintf(fl,"AB - Проверка на Арифметическое Выражение.\n");
Scan();
if(nx==')')
{
Error(12);
return(NO);
}
Term();
if(nx=='+')
{
AB();
}
else if(nx=='-')
{
AB();
}
if(nx==NULL)
return(OK);
else if(nx!='*' && nx!='/' && nx!=')')
Error(1);
return(YES);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Терм.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int Term(void)
{
#ifdef TEST
cprintf("Term - Проверка на Терм.\r\n");
#endif
fprintf(fl,"Term - Проверка на Терм.\n");
Operand();
if(nx=='/')
{
Scan();
Term();
}
else if(nx=='*')
{
Scan();
if(nx=='*')
{
Scan();
Term();
}
else Term();
}
if(nx==NULL)
return(OK);
else if(nx!='+' && nx!='-' && nx!=')')
Error(2);
return(OK);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Операнд.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int Operand(void)
{
#ifdef TEST
cprintf("Operand - Проверка на Операнд.\r\n");
#endif
fprintf(fl,"Operand - Проверка на Операнд.\n");
if(nx=='(')
{
AB();
if(nx!=')')
Error(3);
else
{
Scan();
return(OK);
}
}
else if(IDENT() == NO)
{
if(Float() == NO)
Error(4);
}
return(OK);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Идентификатор.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int IDENT(void)
{
#ifdef TEST
cprintf("IDENT - Проверка на Идентификатор с символа %c.\r\n",nx);
#endif
fprintf(fl,"IDENT - Проверка на Идентификатор с символа %c.\n",nx);
if(isalpha(nx))
{
while(isalpha(nx) || isdigit(nx))
Scan();
return(YES);
}
return(NO);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ошибки.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Error(int num)
{
char *E[]={
"Ожидается '+' или '-'.",
"Ожидается '*','/' или '**'.",
"Ожидается ).",
"Ожидается идентификатор или целое без знака.",
"Отсутствует ','.",
"Не конец строки.",
"Ожидается (.",
"Метка - не целое без знака.",
"Отсутствуют метки.",
"Не найден оператор IF.",
"Отсутствует метка.",