词法分析的自动机c语言,利用自动机进行词法分析.DOC

利用自动机进行词法分析

实验目的

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.程序分析:

该程序的完成是建立在,理解课本知识的基础之上。刚开始编写程序的时候,根本就没有用的课本上的知识,也没理解题意,只是建立了二维数组,没有状态变换。通过反复读课本,弄明白该题的思路,即:由形式化语言写出正规式,再由正规式画出状态图,状态表,最后通过建立二维数组,实现状态变换。当然在此,我引入 ’#’作为结束标识符,也是为了简化了改题的难度。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值