Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
int Access();
int Empty(char s[]);
class Dka{
char State[30], Symbols[30], Edge[10][20][20];
int N_S, N_T, edge_n[10], Flag, e_Flag, F_wrong_n;
int NotState(char c);
int Belong(char str[], char stack[], int err_n);
public:
Dka();
void ShowGrammatic();
void Check(char str[]);
};
Dka::Dka()
{ FILE *in;
char c, s[256], str[50][256], ss[100];
int flag, n=0, i=0, j, h, k;
if ((in = fopen("g.txt", "r")) == NULL)
{fprintf(stderr, "Cannot open sourse file g.txt\n");getch();exit(0);}
do
{ c = fgetc(in);
if((c=='\n')||(feof(in))){s[i]='\0'; i=0;if(Empty(s)!=1)strcpy(str[n++],s);}
else s[i++]=c;
}while(!feof(in));
fclose(in);
//-------------------------------------------
for(i=0;i<strlen(str[0]);i++)if(str[0][i]==' '){printf("ЋиЁЎЄ ў Ја ¬¬ вЁЄҐ(“ЎҐаЁвҐ Їа®ЎҐ«л)\n>> %s",str[0]);getch();exit(0);}
for(i=0;i<strlen(str[1]);i++)if(str[1][i]==' '){printf("ЋиЁЎЄ ў Ја ¬¬ вЁЄҐ(“ЎҐаЁвҐ Їа®ЎҐ«л)\n>> %s",str[1]);getch();exit(0);}
if(n-2!=strlen(str[0])){printf("ЋиЁЎЄ ў Ја ¬¬ вЁЄҐ(ЌҐб®®вўҐвбвўЁҐ зЁб« ҐвҐа¬Ё «мле бЁ¬ў®«®ў Ё Їа ўЁ«)");getch();exit(0);}
for(i=2;i<n;i++) if((str[i][1]!='-')||(str[i][2]!='>'))
{printf("ЋиЁЎЄ ў Ја ¬¬ вЁЄҐ(ЌҐЇа ўЁ«мл© бЁв ЄбЁб)\nЋЎа §Ґж: A->1|aD|e\n>> %s",str[i]);getch();exit(0);}
for(i=2;i<n;i++)
{flag=0;
for(j=0;j<strlen(str[0]);j++)if(str[i][0]==str[0][j]){flag=1;break;}
if(flag==0){printf("ЋиЁЎЄ ў Ја ¬¬ вЁЄҐ(ЌҐЁ§ўҐбвл© ҐвҐа¬Ё «мл© бЁ¬ў®«)\n>> %c\n",str[i][0]);getch();exit(0);}
}
for(i=2;i<n;i++)
{if(str[i][3]=='|'){printf("ЋиЁЎЄ ў Ја ¬¬ вЁЄҐ(| ЌҐ ¬®¦Ґв Ўлвм ўЇҐаҐ¤Ё)\n>> %s",str[i]);getch();exit(0);}
if(str[i][strlen(str[i])-1]=='|'){printf("ЋиЁЎЄ ў Ја ¬¬ вЁЄҐ(| ЌҐ ¬®¦Ґв Ўлвм ў Є®жҐ)\n>> %s",str[i]);getch();exit(0);}
for(j=3;j<strlen(str[i]);j++)
{if(str[i][j]==' '){printf("ЋиЁЎЄ ў Ја ¬¬ вЁЄҐ(“ЎҐаЁвҐ Їа®ЎҐ«л)\n>> %s",str[i]);getch();exit(0);}
if(str[i][j]!='|')
{flag=0; for(h=0;h<strlen(str[0]);h++){if(str[i][j]==str[0][h]){flag=1;break;}}
if(flag==0)for(h=0;h<strlen(str[1]);h++){if(str[i][j]==str[1][h]){flag=1;break;}}
if(str[i][j]=='e')flag=1;
if(flag==0){printf("ЋиЁЎЄ ў Ја ¬¬ вЁЄҐ(ЌҐЁ§ўҐбвл© бЁ¬ў®«)\n>> %c\n",str[i][j]);getch();exit(0);}
}
}
}
k=0; ss[k++]=str[2][0];
for(i=3;i<n;i++)
{for(j=0;j<k;j++)if(str[i][0]==ss[j]){printf("ЋиЁЎЄ ў Ја ¬¬ вЁЄҐ(„ў®©®Ґ ®ЇЁб ЁҐ Їа ўЁ« б ҐвҐа¬Ё «мл¬ бЁ¬ў®«®¬)\n>> %c\n",str[i][0]);getch();exit(0);}
ss[k++]=str[i][0];
}
//-------------------------------------------
N_S = strlen(str[0]); N_T = strlen(str[1]); e_Flag=0;
strcpy(State,str[0]); strcpy(Symbols,str[1]);
for(i=0;i<N_S;i++)
for(j=2;j<n;j++)
if(State[i]==str[j][0])
{h=3;k=0; edge_n[i]=0;
do{
while((str[j][h]!='|')&&(str[j][h]!='\0')) ss[k++]=str[j][h++];
edge_n[i]++;ss[k]='\0';
if(strcmp(ss,"e")==0){strcpy(Edge[i][edge_n[i]-1],"");e_Flag=1;}else strcpy(Edge[i][edge_n[i]-1],ss);
k=0;
}while(str[j][h++]!='\0');
}
}
void Dka::ShowGrammatic()
{ int i, j;
textcolor(13);
cprintf("ѓа ¬¬ вЁЄ : G = ({");
for(i=0;i<N_S;i++){textcolor(11);cprintf("%c",State[i]);
textcolor(13);if(i!=N_S-1)cprintf(",");
}
cprintf("},{");
for(i=0;i<N_T;i++){textcolor(11);cprintf("%c",Symbols[i]);
textcolor(13);if(i!=N_T-1)cprintf(",");
}
cprintf("},P,%c)",State[0]);printf("\n");
cprintf("P: ");
for(i=0;i<N_S;i++)
{ cprintf("%c",State[i]);textcolor(10);cprintf("-> ");
for(j=0;j<edge_n[i];j++)
{textcolor(13);if(strcmp(Edge[i][j],"")!=0)cprintf("%s",Edge[i][j]);
else cprintf("e");
if(j!=edge_n[i]-1){textcolor(10);cprintf("|");textcolor(13);}
}
if(i!=N_S-1)printf("\n ");
}
}
int Dka::NotState(char c)
{int i;
for(i=0;i<N_T;i++)
if(c==Symbols[i])return(1);
return(0);
}
int Dka::Belong(char str[], char Stack[], int err_n)
{ char s[80], temp_stack[80], stack[80], temp[80];
int i, j, h;
strcpy(s,str); strcpy(stack,Stack);
if(strlen(stack)==0){if(Flag==1) return(1);else return(0);}
if(NotState(stack[0])==1)
do{
if(strlen(s)!=0)
{if(stack[0]==s[0]){for(i=0;i<strlen(stack);i++)temp[i]=stack[1+i];
strcpy(stack,temp);
for(i=0;i<strlen(s);i++)temp[i]=s[1+i];
strcpy(s,temp);
err_n++;
}
else {if(err_n>F_wrong_n)F_wrong_n = err_n;return(0);}
}else return(0);
if((strlen(s)==0)&&(strlen(stack)==0)) return(1);
if((strlen(s)!=0)&&(strlen(stack)==0)){if(err_n>F_wrong_n)F_wrong_n = err_n;return(0);}
}while(NotState(stack[0])==1);
for(i=0;i<N_S;i++)
if(stack[0]==State[i])
for(j=0;j<edge_n[i];j++)
{if(e_Flag==1){if(strlen(stack)>strlen(s)+1)continue;}
else{if(strlen(stack)>strlen(s))continue;}
for(h=0;h<strlen(stack);h++)temp[h]=stack[1+h];
strcpy(temp_stack,Edge[i][j]);strcat(temp_stack,temp);
if(Belong(s,temp_stack,err_n)==1) return(1);
}
return(0);
}
void Dka::Check(char str[])
{ char s[256];
char stack[256];
int i;
Flag=0; if(strlen(str)==0) Flag=1;
strcpy(s,str);
printf("бва®Є ");textcolor(14);cprintf(">> ");
stack[0]=State[0]; stack[1]='\0';
F_wrong_n=0;
if(Belong(s,stack,0)==1){if(strcmp(s,"")!=0)printf("%s ",s);else printf("e ");
textcolor(10);cprintf("ЇаЁ ¤«Ґ¦Ёв");
}
else {textcolor(15);
if(strcmp(s,"")==0)cprintf("e ");else
{for(i=0;i<strlen(s);i++)if(F_wrong_n==i)cprintf("%c",s[i]);else printf("%c",s[i]);
printf(" ");
}
textcolor(12);
cprintf("Ґ ЇаЁ ¤«Ґ¦Ёв");
}
printf(" ¤ ®© Ја ¬¬ вЁЄҐ\n");
}
int main()
{ clrscr();
Dka *Avt = new Dka();
FILE *in;
char c, s[256], str[50][256];
int n=0, i=0;
if ((in = fopen("input.txt", "r")) == NULL)
{fprintf(stderr, "Cannot open sourse file input.txt\n");getch();return(0);}
do
{ c = fgetc(in);
if((c=='\n')||(feof(in))){s[i]='\0'; i=0;if(Empty(s)==1)strcpy(s,"");strcpy(str[n++],s);}
else s[i++]=c;
}while(!feof(in));
while(Empty(str[n-1])==1)n--;
fclose(in);
//-------------------------------------
printf("-------------------------------------------------------------------------------\n");
Avt->ShowGrammatic();
printf("\n-------------------------------------------------------------------------------\n");
for(i=0;i<n;i++) Avt->Check(str[i]);
printf("-------------------------------------------------------------------------------\n");
printf("Ќ ¦¬ЁвҐ «оЎго Є®ЇЄг зв®Ўл ўл©вЁ Ё§ Їа®Ја ¬¬л");
_setcursortype(_NOCURSOR);
//-------------------------------------
delete(Avt);
getch();
return(0);
}
int Empty(char s[])
{int i=0;
if(strcmp(s,"")==0)return(1);
for(i=0;i<strlen(s);i++)if((s[i]!=' ')&&(s[i]!='\t'))return(0);
return(1);
}