Ìèíèñòåðñòâî
íàóêè, âûñøåé øêîëû è òåõíè÷åñêîé ïîëèòèêè Ðîññèéñêîé Ôåäåðàöèè.
Íîâîñèáèðñêèé
Ãîñóäàðñòâåííûé
Òåõíè÷åñêèé
Óíèâåðñèòåò.
Êóðñîâàÿ ðàáîòà ïî ñèñòåìíîìó ïðîãðàììèðîâàíèþ.
Îïåðàòîð ïðèñâàèâàíèÿ ÿçûêà
FORTRAN.
Ôàêóëüòåò: ÀÂÒ.
Êàôåäðà: ÀÑÓ.
Ãðóïïà: À-513.
Ñòóäåíò: Åôèìåíêî Äåíèñ Âëàäèìèðîâè÷.
Ïðåïîäàâàòåëü: Øîðíèêîâ Þðèé Âëàäèìèðîâè÷.
Àññèñòåíò: Ïàíîâà
Âåðà Áîðèñîâíà.
Äàòà: 10 èþíÿ
1997 ãîäà.
Îòìåòêà î
çàùèòå: _______________________________
Íîâîñèáèðñê – 1997.
ßçûê îïåðàòîðà
ïðèñâàèâàíèÿ FORTRAN.
Èäåíòèôèêàòîð
= àðèôìåòè÷åñêîå âûðàæåíèå
Àðèôìåòè÷åñêîå
âûðàæåíèå – âûðàæåíèå, ñîäåðæàùåå â ñåáå îïåðàöèè *, /, -, +, **, à òàêæå ( ).
**
– âîçâåäåíèå â ñòåïåíü.
G[<ÎÏÅÐÀÒÎÐ>]:
1. <ÎÏÅÐÀÒÎÐ>
® <ÈÄÅÍÒÈÔÈÊÀÒÎÐ> =
<ÂÛÐÀÆÅÍÈÅ>
2. <ÂÛÐÀÆÅÍÈÅ>
® Òç<ÂÛÐÀÆÅÍÈÅ>+Ò
ç
<ÂÛÐÀÆÅÍÈÅ>-Ò
3. Ò ® Î çÒ*Î ç Ò/Î êÒ**Î
4. Î ®(<ÂÛÐÀÆÅÍÈÅ>)
ç<ÈÄÅÍÒÈÔÈÊÀÒÎÐ>
ç<ÄÁÇ>
5. <ÈÄÅÍÒÈÔÈÊÀÒÎÐ>
® Á{Á çÖ}[L]
6. <ÄÁÇ> ® Ö{Ö}[.Ö{Ö}][L]
Ò |
– |
ÒÅÐÌ |
Î |
– |
ÎÏÅÐÀÍÄ |
Á |
– |
ÁÓÊÂÀ |
Ö |
– |
ÖÈÔÐÀ |
ÄÁÇ |
– |
ÄÐÎÁÍÎÅ
ÁÅÇ ÇÍÀÊÀ |
L |
– |
ÊÎÍÅÖ
ÑÒÐÎÊÈ (ïóñòî) |
** |
– |
ÂÎÇÂÅÄÅÍÈÅ
 ÑÒÅÏÅÍÜ |
Äàííàÿ
ãðàììàòèêà G[<ÎÏÅÐÀÒÎÐ>], ñîãëàñíî êëàññèôèêàöèè Õîìñêîãî,
ÿâëÿåòñÿ êîíòåêñòíî-ñâîáîäíîé, òàê êàê ïðàâàÿ ÷àñòü êàæäîé ðåäóêöèè íà÷èíàåòñÿ
ëèáî ñ òåðìèíàëüíîãî ñèìâîëà, ëèáî ñ íåòåðìèíàëüíîãî, ïðèíàäëåæàùåãî
îáúåäèí¸ííîìó ñëîâàðþ.
A ® a, AÎVn, aÎV*.
Ãðàììàòèêà
G[<ÎÏÅÐÀÒÎÐ>] íå ÿâëÿåòñÿ àâòîìàòíîé, òàê êàê
íå âñå å¸ ðåäóêöèè íà÷èíàþòñÿ ñ òåðìèíàëüíîãî ñèìâîëà. Ïî ýòîé æå ïðè÷èíå
äàííàÿ ãðàììàòèêà íå ÿâëÿåòñÿ S - ãðàììàòèêîé.
Äëÿ
äàííîé ãðàììàòèêè ðåàëèçîâàí ðàçáîð ìåòîäîì ðåêóðñèâíîãî ñïóñêà, ïîñêîëüêó îíà
îòíîñèòñÿ ê êëàññó êîíòåêñòíî-ñâîáîäíûõ.
Èäåÿ ìåòîäà ñîñòîèò â òîì, ÷òî êàæäîìó
íåòåðìèíàëüíîìó ñèìâîëó ñòàâèòñÿ â ñîîòâåòñòâèå îïðåäåë¸ííàÿ ïðîãðàììíàÿ
åäèíèöà (ôóíêöèÿ), êîòîðàÿ ðàñïîçíà¸ò öåïî÷êó, ïîðîæäàåìóþ ýòèì íåòåðìèíàëîì.
Ýòè ïðîöåäóðû è ôóíêöèè âûçûâàþòñÿ â
ñîîòâåòñòâèè ñ ïðàâèëàìè ãðàììàòèêè è èíîãäà âûçûâàþò ñàìè ñåáÿ.
Äàííûé ìåòîä ðåàëèçîâàí íà ÿçûêå C++, ïîñêîëüêó îí îáëàäàåò ðåêóðñèâíûìè
âîçìîæíîñòÿìè.
Äëÿ
äàííîé ãðàììàòèêè ïðîèçâîäèòñÿ òîëüêî äèàãíîñòèêà è íåéòðàëèçàöèÿ îøèáîê.
Èñïðàâëåíèå îøèáîê íå ïðîèçâîäèòñÿ.
Íåéòðàëèçàöèÿ
îøèáîê îñóùåñòâëÿåòñÿ ïî ìåòîäó Àéðîíñà, òî åñòü, ñïóñêàÿñü ïî ñèíòàêñè÷åñêîìó
äåðåâó áåç âîçâðàòà ïî êîíòåêñòó, ïðè îáíàðóæåíèè òóïèêîâîé ñèòóàöèè
îòáðàñûâàþòñÿ òå ëèòåðû (ñèìâîëû), êîòîðûå ïðèâåëè â òóïèêîâóþ ñèòóàöèþ è
ðàçáîð ïðîäîëæàåòñÿ.
12=1
Èìÿ
èäåíòèôèêàòîðà äîëæíî íà÷èíàòüñÿ ñ áóêâû.
\---------------------------------------------------------\
s223=(s)+(((d)))
ÎØÈÁÎÊ ÍÅÒ!!!!!
\---------------------------------------------------------\
sdsds=skshj**mxnx dc
Ïðîïóùåíà
îïåðàöèÿ èëè íåïðàâèëüíîå èìÿ èäåíòèôèêàòîðà.
\---------------------------------------------------------\
;;=0
Èìÿ
èäåíòèôèêàòîðà äîëæíî íà÷èíàòüñÿ ñ áóêâû.
Èäåíòèôèêàòîð
ñîñòîèò òîëüêî èç áóêâ èëè öèôð.
\---------------------------------------------------------\
as=115/3
ÎØÈÁÎÊ
ÍÅÒ!!!!!
\---------------------------------------------------------\
32=-*=
Èìÿ
èäåíòèôèêàòîðà äîëæíî íà÷èíàòüñÿ ñ áóêâû.
Ïðîïóùåí
èäåíòèôèêàòîð èëè ÷èñëî.
Ïðîïóùåí
èäåíòèôèêàòîð èëè ÷èñëî.
Íåèçâåñòíàÿ
îïåðàöèÿ èëè íåïðàâèëüíîå èìÿ èäåíòèôèêàòîðà.
Ïðîïóùåí
èäåíòèôèêàòîð èëè ÷èñëî.
\---------------------------------------------------------\
sdvsf+gsdf=0
Ñëåâa
îò '='îïåðàöèé áûòü íå ìîæåò .
\---------------------------------------------------------\
jhg=321+321/54*4(s+25)
Ïðîïóùåíà
îïåðàöèÿ èëè íåïðàâèëüíîå èìÿ èäåíòèôèêàòîðà.
\---------------------------------------------------------\
d56gfsdfg=(ld+5
Äëèíà
èìåíè èäåíòèôèêàòîðà íå äîëæíà áûòü áîëüøå 6.
Îòñóòñòâóåò
')'.
\---------------------------------------------------------\
// SP_KURS.CPP:ÊÓÐÑÎÂÀß ÐÀÁÎÒÀ ÏÎ ÑÈÑÒÅÌÍÎÌÓ
ÏÐÎÃÐÀÌÌÈÐÎÂÀÍÈÞ. //
// ÎÏÅÐÀÒÎÐ ÏÐÈÑÂÀÈÂÀÍÈß ßÇÛÊÀ
"ÔÎÐÒÐÀÍ" //
// èìÿ ôàéëà test
#include<process.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include<conio.h>
#include<io.h>
#define UP
72 /*
ñòðåëêà ââåðõ */
#define DOWN 80 /* ñòðåëêà âíèç */
#define EXIT '\33' /*
Esc */
#define
END 100
enum
LEX{ERROR,CBZ,ID,PLUS,MIN,DIV,MUL,STEP,SKL,SKR,RAV,_EOLN_,_EOF_};
int next,number=0,num=0,temp,line=1,err[80],sum;
int mistake[15][80],ofset=0;
char cordinat[80][80],filename[80];
char* type_mis[]={"ÎØÈÁÎÊ ÍÅÒ!!!!!",
"Èìÿ
èäåíòèôèêàòîðà äîëæíî íà÷èíàòüñÿ ñ áóêâû.",
"Èäåíòèôèêàòîð
ñîñòîèò òîëüêî èç áóêâ èëè öèôð.",
"Ñëåâa
îò '='îïåðàöèé áûòü íå ìîæåò .",
"Íåèçâåñòíàÿ
êîíñòðóêöèÿ (íåò '=').",
"Äëèíà
èìåíè èäåíòèôèêàòîðà íå äîëæíà áûòü áîëüøå 6.",
"Îòñóòñòâóåò
')'.",
"Íåèçâåñòíàÿ
îïåðàöèÿ èëè íåïðàâèëüíîå èìÿ èäåíòèôèêàòîðà.",
"Ïðîïóùåí
èäåíòèôèêàòîð èëè ÷èñëî.",
"Îòñóòñòâóåò
'('.",
"Ïðîïóùåíà
îïåðàöèÿ èëè íåïðàâèëüíîå èìÿ èäåíòèôèêàòîðà.",
"Îòñóòñòâóåò
âûðàæåíèå (À=?) . ",
"Îòñóòñòâóåò èäåíòèôèêàòîð(?=B).",
" ",};
const int X1=2,Y1=20,X2=80,Y2=25;
const int YWINDOW=Y2-Y1+1;
void viewwin(int ,int );
void putmistake(int );
int MENU(char
*);
void identif();
void ravno();
void expr(void);
void term(void);
void operand(void);
int
scaner(void);
void error(int);
void makefile(void);
FILE *in,*out;
void main(void)
{strcpy(cordinat[0],"\n");
mistake[0][0]=13;mistake[0][1]=END;
clrscr();
printf("Ââåäèòå
èìÿ îáðàáàòûâàåìîãî ôàéëà:");
gets(filename);
if((in=fopen(filename,"r"))==NULL)
{printf("\n ÎØÈÁÊÀ!!! ÔÀÉË Ñ ÒÀÊÈÌ ÈÌÅÍÅÌ ÍÅ
ÑÓÙÅÑÒÂÓÅÒ!!!");
exit(-1);
}
while(!feof(in))
{ravno();
mistake[line][ofset]=END;
line++;
ofset=0;
}
fcloseall();
makefile();
num=0;
window(1,1,80,25);
clrscr();
gotoxy(1,1);
MENU(" ÎÏÅÐÀÒÎÐ ÏÐÈÑÂÀÈÂÀÍÈß ßÇÛÊÀ
/""ÔÎÐÒÐÀÍ/""\n");
clrscr();
window(1,1,80,25);
clrscr();
printf("\n\n\n\n\n\n\n\n\n\n ÂÑÅ ÎØÈÁÊÈ ÕÐÀÍßÒÜÑß Â ÔÀÉËÅ
/""ERRORS.TXT/""!!!!!");
printf("\n\n\n\n\n\n\n\n\n\n ÍÀÆÌÈÒÅ ËÞÁÓÞ ÊËÀÂÈØÓ!!!!!! ");
fcloseall();
exit(1);
}
void ravno()
{temp=0;
num=0;
sum=0;
next=scaner();
if((next!=_EOLN_)&&(next!=_EOF_))
{if(next==RAV)
{error(12);
err[0]=END;
}
else
identif();
if(next!=RAV)
error(4);
else
{temp=1;
if(err[0]!=END)
{if(err[0]!=ID) error(1);
for(int i=1;i<sum;i++)
{next=err[i];
identif();
}
}
temp=2;
next=scaner();
if((next==_EOF_)||(next==_EOLN_)) error(11);
else
{while(1)
{expr();
if(next==SKL)
error(10);
else
{if(next==SKR)
{error(9);
next=scaner();
}
if(next==ID)
{error(10);
next=scaner();
}
if(next==ERROR) error(7);
if((next==_EOF_)||(next==_EOLN_)) break;
next=scaner();
}//else
} //while
} //else
}//else
}//if
else mistake[line][ofset++]=13;
}
int scaner(void)
{int liter;
liter=fgetc(in);
num++;
if((isspace(liter))||(liter=='\t'))
{while((isspace(liter))||(liter=='\t'))
{if(liter=='\n') return(11);
liter=fgetc(in);
}
}
if(isdigit(liter))
{while(isdigit(liter))
{liter=fgetc(in);
num++;
}
if(liter=='.')
{liter=fgetc(in);
while(isdigit(liter))
{liter=fgetc(in);
num++;
}
ungetc(liter,in);
num--;
return(1);
}
else
{if(isalpha(liter))
{number=0;
while(isalnum(liter))
{number++;
num++;
liter=fgetc(in);
}
ungetc(liter,in);
num--;
return(2);
}
else
switch(liter)
{case
'+':num=0;return(3);
case '-':num=0;return(4);
case '/':num=0;return(5);
case '*':num=0;
if((liter=fgetc(in))=='*') return(7);
else
{ungetc(liter,in);
return(6);
}
case
'(':return(8);
case ')':return(9);
case '=':return(10);
case '\n':return(11);
case EOF:return(12);
default:return(0);
}
}//else
}
//
ÐÀÑÏÎÇÍÀÅÒ ÎØÈÁÊÈ Â ÈÄÅÍÒÈÔÈÊÀÒÎÐÅ.
void identif(void)
{if(temp==0)
{while((next!=RAV)&&(next!=_EOLN_)&&(next!=_EOF_))
{err[sum]=next;
sum++;
next=scaner();
}
}
if(temp==1)
{if((next!=CBZ)&&(next!=ID))
{if(next==ERROR) error(2);
else
error(3);
}
number=num-1;
num=0;
}
if(number>6)
error(5);
}
// ÍÅÒÅÐÌÈÍÀË "O" <Îïåðàíä>
void operand()
{if(next==SKL)
{next=scaner();
expr();
if(next!=SKR) error(6);
else next=scaner();
}
else
{if(next==ID){identif();next=scaner();}
else
{if(next!=CBZ)
{if((next!=_EOLN_)&&(next!=_EOF_))
{if(next==ERROR)
{error(7);
next=scaner();
operand();
}
else
{if(next==RAV) error(7);
else error(8);
}
}
else error(8);
}
else next=scaner();
}//else
}//else
}
// ÍÅÒEÐÌÈÍÀË "Å" <Âûðàæåíèå>
void
expr(void)
{term();
while((next==PLUS)||(next==MIN))
{next=scaner();
expr();
}
}
// ÍÅÒÅÐÌÈÍÀË "T" <Òåðì>
void
term(void)
{operand();
while((next==DIV)||(next==MUL)||(next==STEP))
{next=scaner();
term();
}
}
void
error(int choice)
{switch(choice)
{case 1:mistake[line][ofset++]=1; break;
case 2:mistake[line][ofset++]=2;
break;
case
3:mistake[line][ofset++]=3;
break;
case 4:mistake[line][ofset++]=4; break;
case 5:mistake[line][ofset++]=5; break;
case 6:mistake[line][ofset++]=6; break;
case 7:mistake[line][ofset++]=7; break;
case 8:mistake[line][ofset++]=8; break;
case 9:mistake[line][ofset++]=9; break;
case 10:mistake[line][ofset++]=10; break;
case 12:mistake[line][ofset++]=12; break;
case 11:mistake[line][ofset++]=11; break;
default:break;
}
}
void
makefile(void)
{char
*s;
int
num_str=0,oftemp,rep;
if((out=fopen("errors.txt","w"))==NULL)
{printf("\n ÎØÈÁÊÀ!!! ÔÀÉË Ñ ÒÀÊÈÌ ÈÌÅÍÅÌ
ÍÅ ÑÓÙÅÑÒÂÓÅÒ!!!");
exit(-1);
}
if((in=fopen(filename,"r"))==NULL)
{printf("\n ÎØÈÁÊÀ!!! ÔÀÉË ÍÅËÜÇß ÎÒÊÐÛÒÜ
ÄËß ÇÀÏÈÑÈ!!!");
exit(-1);
}
while(num_str++,fgets(s,80,in)!=NULL)
{fputs("\\---------------------------------------------------------\\",out);
fputc('\n',out);
fputs(s,out);
fputc('\n',out);
rep=strlen(s);
s[rep-1]='\0';
strcpy(cordinat[num_str],s);
if((oftemp=mistake[num_str][0])==END)
{fputs(type_mis[0],out);
fputc('\n',out);
}
else
{for(int k=0;mistake[num_str][k]!=END;k++)
{oftemp=mistake[num_str][k];
fputs(type_mis[oftemp],out);
fputc('\n',out);
}
}
}
fputs("\\---------------------------------------------------------\\",out);
fputc('\n',out);
fcloseall();
}
//
MENU
int MENU(char *s)
{int dy,n;
dy=line-1;
textbackground(WHITE);
textcolor(YELLOW);
window(1,1,80,25);
clrscr();
gotoxy(2,1);
cprintf(" SDenis\n
");
gotoxy(2,2);
cputs(s);
gotoxy(2,3);
cprintf("Èñïîëüçóéòå êóðñîð ââåðõ/âíèç
äëÿ âûáîðà ïðîñìàòðèâàåìîé ñòðîêè.\n");
gotoxy(2,4);
cprintf("<ENTER> - äëÿ ïðîñìîòðà
îøèáîê â ñòðîêå(ñòðîêà âûäåëÿåòñÿ). \n");
gotoxy(2,5);
cprintf("<ESC> - âûõîä.\n");
gotoxy(2,6);
textbackground(WHITE);
textcolor(RED);
cprintf("******************** ÎØÈÁÊÈ
 ÑÒÐÎÊÀÕ *************************\n");
textbackground(WHITE);
textcolor(YELLOW);
gotoxy(2,19);
cprintf("******************* ÑÒÐÎÊÈ
ÂÀØÅÃÎ ÔÀÉËÀ ****************************\n");
window(X1,Y1,X2,Y2);
textcolor(BLACK);
viewwin(0,YWINDOW);
n = 0;
int Y=1;
while(1)
{char c;
gotoxy(1,Y);
textbackground(GREEN);
cprintf("%s",cordinat[n]);
textbackground(WHITE);
c=(c=getch())==0?c=getch():c;
gotoxy(1,Y);
cprintf("%s",cordinat[n]);
switch (c)
{case EXIT:
return(-1);
case '\r': /*enter*/
window(2,7,80,18);
clrscr();
putmistake(n);
window(X1,Y1,X2,Y2);
break;
case UP:
if (Y==1) viewwin(n>0?n-1:n,YWINDOW);
else Y--;
if(n>0) n--;
break;
case DOWN:
if(Y==YWINDOW)
viewwin((n==dy?n:n+1)-YWINDOW+1,YWINDOW);
else Y++;
if(n+1==dy)
{n=0;
Y=1;
viewwin(n,YWINDOW);
}
else n++;
break;
}
}
}
void
viewwin(int num,int numline)
{clrscr();
for(int
a=0;a<numline;a++)
{gotoxy(1,a+1);
cprintf("%s",cordinat[num++]);
}
}
void
putmistake(int n)
{int
offtemp,x=1,y=1;
if((offtemp=mistake[n][0])==END)
{cprintf("%s",type_mis[0]);
}
else
{for(int k=0;mistake[n][k]!=END;k++)
{offtemp=mistake[n][k];
if(offtemp==13)
cprintf("%s\n",type_mis[offtemp]);
else
{cprintf("%d.%s\n",k+1,type_mis[offtemp]);
x++;
y++;
gotoxy(x,y);
}
}
}
}
1. Êóðñ ëåêöèé ïî
ñèñòåìíîìó ïðîãðàììèðîâàíèþ.
2. Ãåðáåðò Øèëäò «C äëÿ ïðîôåññèîíàëüíûõ ïðîãðàììèñòîâ».
3. Â.Í. Ëåáåäåâ
«Ââåäåíèå â ñèñòåìû ïðîãðàììèðîâàíèÿ»
![]() |