c语言中字符减1,用c语言编写一个词法分析器用来识别:由任意个a或b开始后接aa再自加或自减1的字符串...

该博客介绍了一个使用C语言编写的词法分析器,其功能是识别以'a'或'b'开头,后接'aa'并加或减1的字符串。程序通过判断输入字符串的特定条件来确定是否符合给定的正规式,并输出“yes”或“no”来表明结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用c语言编写一个词法分析器用来识别:由任意个a或b开始后接aa再自加或自减1的字符串

答案:1  信息版本:手机版

解决时间 2020-07-24 00:30

已解决

2020-07-23 05:24

该词法分析器的功能:

从键盘读入或打开文件读入字符串,词法分析器读入字符串后扫描源字符串,若发现符合符合正规式r=(a|b)*aa(+|-)1描述的字符串时,输出“yes”或“可接受”或“可识别”,否则输出“no”或“不可识别”。

最佳答案

2020-07-23 06:21

我们通过这个正规式可以知道,最后4个字符是确定的,即aa+1或aa-1。然后再判断前面的字符是否为a或b。我的想法是从后往前判断,只有当前的条件符合时再进行下面的判断。

我们可以将正规式分为4部分,于是得到一下几个判断的原则:

1.读入的字符串长度必须大于等于4;

2.最后一个字符必须为‘1’;

3.倒数第2个字符必须为‘+’或‘-’;

4.倒数第3个和第4个字符必须为‘a’;

5.前面的字符必须为‘a’或‘b’;

下面是具体的程序:

#include

#include

#include

//判断输入的字符串是否符合正规式

//返回0表示不符合,返回1表示符合正规式

int func(char *s)

{

int i, j, t;

char c;

t = strlen(s);

//如果输入的长度小于4,一定不符合正规式

if(t<4)

{

return 0;

}

//如果最后一个不是1,则不符合正规式

if(s[t-1]!='1')

{

return 0;

}

//如果最后是1但倒数第二个不是+或-,则不符合正规式

if(s[t-2]!='+' && s[t-2]!='-')

{

return 0;

}

//如果前两个条件符合,则检测是否存在连续的两个a

//只要其中一个不为a,则不符合正规式

if(s[t-4]!='a' || s[t-3]!='a')

{

return 0;

}

//如果前面的条件符合,则进行此判断

//此时不用判断读入的字符串长度是否大于4或者等于4,

//因为如果字符串的长度等于4时,根本不进入循环

for(i=0; i

{

if(s[i]!='a' && s[i]!='b')

{

return 0;

}

}

//如果条件都符合,则符合正规式

return 1;

}

int main()

{

char s[200];

while(scanf("%s", s)==1)

{

if(func(s)==1)

{

printf("yes\n");

}

else

{

printf("no\n");

}

}

return 0;

}

我要举报

如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

大家都在看

推荐资讯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值