Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
17.04.2013
Размер:
6.87 Кб
Скачать
#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);
}
Соседние файлы в папке ЛАБА N3