编程语言
首页 > 编程语言> > 实验一、简单的词法设计——DFA模拟程序

实验一、简单的词法设计——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];
 }
 

标签:char,return,状态,词法,模拟程序,DFA,输入,define
来源: https://www.cnblogs.com/zenglearn/p/16256176.html