利用自动机进行词法分析
实验目的
1.编写一个确定的有穷自动机程序, 并进行词法分析
2.掌握自动机的识别逻辑
实验平台
Windows+VisualC++
实验内容
编写一个简单的自动机程序, 仅用来识别标识符, 输入一个字符串, 若该字符串符合标识符规则, 程序输出 ‘YES’, 否则输出 ‘NO”。
实验步骤
1 写出判断输入串的正规式。
2画出有限自动机的状态图。
3画出有限自动机的状态表。
4用C语言程序实现对输入串的判定,基本原理以有限自动机最终得到的状态表或状态图来实现。
具体步骤
我们知道:标识符是由,英文字母、数字、’_’和’$’组成,但必须满足,第一个字符不能是数字这一条件。对于标识符而言,英文字母同’_’和’$’功能相同,没有区别。因此,我们假设,用L来表示:英文字母、’_’、’$’,用D来表示数字。于是可以得到下列结果:
正规式:L(L|D)*。
状态图:(比较难画,略)
3.初始状态用0表示,末状态用1表示,不存在的状态用-1表示。
状态表为:
F(0,L)=1 F(0,D)=-1 F(0,其他)=-1 F(0,#)=0
F(1,L)=1 F(1,D)=-1 F(1.其他)=-1 F(1,#)=1
4.C语言程序如下:
#include
#include
#define MAX 100 //定义最大的字符串长度
main()
{
int f[2][4]={{1,-1,-1,0},{1,1,-1,1}};
char DataInput[MAX];
int DataInputC[MAX];
int i,sub;
char ynexit;
printf("程序功能:输入一个字符串,判断它是否是无符号定点实数。\n");
while(true)
{
printf("请输入以\"#\"号结束的无空格字符串:");
scanf("%s",&DataInput);
i=0;
while(DataInput[i]!='#'&& i
{
if(DataInput[i]<='z'&&DataInput[i]>='a'||DataInput[i]<='Z'&&DataInput[i]>='A'||DataInput[i]=='_'||DataInput[i]=='$')
DataInputC[i]=0;
else if(DataInput[i]<='9'&&DataInput[i]>='0')
DataInputC[i]=1;
else
DataInputC[i]=2;
i++;
}
if(DataInput[i]=='#')
DataInputC[i]=3;
i=0;
sub=0;
while(DataInputC[i]!=3)
{
if(f[sub][DataInputC[0]]==-1)
{
printf("NO\n");break;
}
sub=f[sub][DataInputC[i]];
i++;
}
if(f[sub][DataInputC[i]]==1)
printf("YES\n");
printf("继续测试吗:(Y/N)");
if((ynexit=getchar())=='N'||(ynexit=getchar())=='n')
{
break;
}
}
return 0;
}
5.程序分析:
该程序的完成是建立在,理解课本知识的基础之上。刚开始编写程序的时候,根本就没有用的课本上的知识,也没理解题意,只是建立了二维数组,没有状态变换。通过反复读课本,弄明白该题的思路,即:由形式化语言写出正规式,再由正规式画出状态图,状态表,最后通过建立二维数组,实现状态变换。当然在此,我引入 ’#’作为结束标识符,也是为了简化了改题的难度。