7-1 简单词法分析
#include
#include
int main()
{
//DFA数组/矩阵
int DFA[4][4]={1,0,-1,-1,-1,3,1,2,1,-1,-1,-1,-1,-1,-1,-1};
//输入串
char str[50];
gets(str);
//状态,也是DFA的行标
int state=0;
//DFA矩阵的列标
int j=0;
//正在检查的字符
int i=0;
//循环控制变量
int k=0;
int m=0;
//统计字符串被划分为了多少个词
int p=0;
while(i<(int)strlen(str))//如果输入串没有结束,strlen(str)返回输入串str的长度
{
//由正在检查的字符确定列标
if(str[i]=='a')
j=0;
else if(str[i]=='b')
j=1;
else if(str[i]=='c')
j=2;
else if(str[i]=='d')
j=3;
else//输入错误
{
printf("输入错误\n");
break;
}
//跳转后的状态,即下一个状态
state=DFA[state] [j];
//每进行一次状态转换,意味着向下走了一个字母,记录向下走的数字长度
m++;
if(state==3)
{
for(k;k<=m;k++)
{
printf("%c",str[k]);
}
printf("\n");
p++;
}
//当state=-1时,不能识别或接受
if(state==-1)
{
printf("DFA不接受这个字符串\n");
}
}
printf("字符串共被划分为%d个词",p);
return 0;
}
while(i<(int)strlen(str))
这个循环里缺少i++,导致死循环
输入在第1行中给出N和K(1≤K<N≤100),此后N行,每行包含一个长度不超过10的、仅由小写英文字母组成的非空字符串。