中易网

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

答案:1  悬赏:50  
解决时间 2021-03-29 02:24
该词法分析器的功能:
从键盘读入或打开文件读入字符串,词法分析器读入字符串后扫描源字符串,若发现符合符合正规式r=(a|b)*aa(+|-)1描述的字符串时,输出“yes”或“可接受”或“可识别”,否则输出“no”或“不可识别”。
最佳答案
我们通过这个正规式可以知道,最后4个字符是确定的,即aa+1或aa-1。然后再判断前面的字符是否为a或b。我的想法是从后往前判断,只有当前的条件符合时再进行下面的判断。
我们可以将正规式分为4部分,于是得到一下几个判断的原则:
1.读入的字符串长度必须大于等于4;
2.最后一个字符必须为‘1’;
3.倒数第2个字符必须为‘+’或‘-’;
4.倒数第3个和第4个字符必须为‘a’;
5.前面的字符必须为‘a’或‘b’;

下面是具体的程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//判断输入的字符串是否符合正规式
//返回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<t-4; 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;
}

我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
北京龙泉公墓如何走
绵羊毛怎么剪?
东发路/民丰大街(路口)怎么去啊,有知道地址
结束了“蜀道之难,难以上青天“的铁路干线是?
减肥晚餐是吃红枣银耳汤还是水果好
铁板鱿鱼夹饼怎样做
重庆现在学车要多少钱
中通快递可不可以到达江西省广丰县?
宝宝拉沫沫!!
皂角村地址好找么,我有些事要过去
啤酒屋日语怎么说
买2手跑车会挨宰吗?
临沧云县一中2016高考成绩单
工程机械设备租赁营业执照经营范围有哪些
怎样延长绝经时间 好心人说下吧
推荐资讯
小孩学习跆拳道好吗
内蒙古工商银行行长吴宁锋介历
拿到已经打包好的rpm包后,怎么查看rpm包的编
谁能告诉我瓷砖勾缝剂执行标准是什么呢?
用ic卡冒充借记卡取款属于什么罪
头发出油跟掉头发有关系么~?
周庄欢乐世界地址在哪,我要去那里办事
南昌莲塘哪里有比较大的电脑回收店
宝宝睡硬床好还是软床好
苏州吴江同里哪里招工啊?找工作
老鼠钻风箱歇后语
求给爷爷的生日短信祝福要个性的结合当今实事
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?