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