实验一、简单的词法设计——DFA模拟程序

利用有穷确定自动机M=(
K有穷状态集,
Σ输入字母表,
f转换函数,从状态s出发,沿着标记为a的边所能到达的状态
S,开始状态,S属于K
Z,接收状态,Z是K的子集
)行为模拟程序算法,来对于任意给定的串,若属于该语言时,该过程经有限次计算后就会停止并回答“是”,若不属于,要么能停止并回答“不是”
K当前状态:=S开始状态;
C当前的输入符号:=getchar返回输入串的下一个符号;
while c<>eof do
{K当前状态:=f(K,c)从状态K出发,沿着标记为c的边所能到达的状态;
c当前的输入符号:=getchar返回输入串的下一个符号; };
if K is in Z接收状态 then return (‘yes’)
else return (‘no’)

 #include<stdio.h>   // 转换表大小   #define M 255  #define N 255    // 状态集个数   #define KNUM 4  // 字母表个数  #define LNUM 2  //接受集个数  #define ZNUM 1     // 状态集  char K[KNUM] = {'S', 'U', 'V', 'Q'};  // 字符集  char C[LNUM] = {'a', 'b'};  // 开始状态  char S = 'S';  // 接收状态  char Z[1] = {'Q'};  // 状态转换表  char table[M][N];  // 输入字符串   char str[255];  //输入指针   char *p;    // DFA算法  void DFA(char *p);   // 返回输入串x的下一个符号  char nextChar();  // f(K,c)转换函数   char f(char K, char c);    int main()  {  	printf(请输入待检验的字符串:);  	while(scanf(%s,str) != EOF) 	{ 		p = str; 		DFA(str); 		printf(请输入待检验的字符串:); 	} 	return 0;  }    void DFA(char *p)  {  	  	char K = S;  	char c = nextChar();  	int i = 0;  	while(c != '\0')  	{  		K = f(K,c);  		c = nextChar(); 	} 	// 判断K是否在接收状态Z中  	for(int i = 0; i < ZNUM; i++) 	{ 		if(K == Z[i]) 		{ 			printf(yes\n); 			return; 		} 	} 	printf(no\n);  }    char nextChar()  {  	return *p++;  }    char f(char K, char c)  {  	for(int i=0;i<KNUM;i++) 		for(int j=0;j<LNUM;j++) 			table[i][j]=-1; 	table['S']['a'] = 'U'; 	table['S']['b'] = 'V'; 	table['U']['a'] = 'Q'; 	table['U']['b'] = 'V'; 	table['V']['a'] = 'U'; 	table['V']['b'] = 'Q'; 	table['Q']['a'] = 'Q'; 	table['Q']['b'] = 'Q'; 	 	return table[K][c];  }