学号L81514034专业_网络工程_姓名黄武伟实验日期2018/4/11教师签字成绩实验报告【实验名称】文法类型的判断和推导序列的生成【实验目的】输入:一组任意的文法规则和任意符号串输出:相应的Chomsky^法类型和推导【实验要求】(1)文法的输入应简便(不代表产生式少)(2)指明是哪一类Chomsky文法,给出相应的四元组形式(为方便起见,不考虑0型文法)(3)给出清晰的推导序列,并判断输入的符号串是否为该文法的句型以下为判断文法类型代码段:intyi=1,er=1,left=0,right=0;for(i=0;i
1)er=0;if(er==1){printf("该文法满足2型文法\n");在满足1型文法的基础上若左边字符串个数为1则满足2型文法,在此设置一个标志位,当有一个产生式不满足此条件时标志位置0则不满足1型文法。for(i=0;i2)break;//右部字符大于两个则退出if(m[i].r==1&&m[i].a[m[i].pos]>=65&&m[i].a[m[i].pos]<=90)break;//右部字符为一个非终结符则退出if(m[i].r==2&&(m[i].a[m[i].pos]<65&&m[i].a[m[i].pos+1]<65)||(m[i].a[m[i].pos]>90&&m[i].a[m[i].pos+1]>90))break;//右部字符为两个终结符则退出if(m[i].r==2&&m[i].a[m[i].pos]>=65&&m[i].a[m[i].pos]<=90&&m[i].a[m[i].pos+1]>=65&&m[i].a[m[i].pos+1]<=90)break;////右部字符为两个非终结符则退出if(m[i].r==2&&m[i].a[m[i].pos]>=65&&m[i].a[m[i].pos]<=65&&(m[i].a[m[i].pos+1]<65||m[i].a[m[i].pos+1]>90))left++;//左推倒加1if(m[i].r==2&&(m[i].a[m[i].pos]<65||m[i].a[m[i].pos]>90)&&m[i].a[m[i].pos+1]>=65&&m[i].a[m[i].pos+1]<=90)right++;//右推倒加1if(m[i].r==1&&(m[i].a[m[i].pos]<65||m[i].a[m[i].pos]>90)){left++;right++;}//左右推倒同时加1}if(left==k||right==k)printf("此文法满足3型文法\n");}}源代码如下:#includetypedefstructchara[10];//存储每组产生式intvn_r;//右边非终结符个数intvn_l;//左边非终结符个数intr;//右部符号个数intl;//左部符号个数intpos//右部第一个字符位置}GL;voidmain(){GLm[10];inti=0,j,k;for(i=0;i<10;i++){scanf("%s",m[i].a);//输入时注意大写字母表示非终结符,小写字母和数字表示终结符,#结束if(m[i].a[0]=='#')break;}printf("\n");/*for(j=0;j<10;j++){printf("%s\n",m[j].a);}*/for(i=0;i<10;i++){m[i].vn_r=0;m[i].vn_l=0;m[i].r=0;m[i].l=0;m[i].pos=0;}//初始化结构体内各变量的值i=0;k=0;intthu;//标志位,判断字母在左部还是右部while(m[i].a[0]!='#'){thu=0;for(j=0;j<10;j++){if(m[i].a[j]=='\0')break;if(m[i].a[j]=='-')thu=1;j++;m[i].pos=j+1;//找到各生成式中右边第一个字母位置}else{if(m[i].a[j]>=65&&m[i].a[j]<=90&&thu==0){m[i].vn_l++;m[i].l++;}if(m[i].a[j]>=65&&m[i].a[j]<=90&&thu==1){m[i].vn_r++;m[i].r++;}if((m[i].a[j]<65&&thu==0)||(m[i].a[j]>90&&thu==1&&thu==0))m[i].l++;if((m[i].a[j]<65&&thu==1)||(m[i].a[j]>90&&thu==1&&thu==1))m[i].r++;}}i++;k++;}/*printf("vn_lvn_rlr\n");for(i=0;i1)er=0;}if(er==1){printf("该文法满足2型文法\n");for(i=0;i2)break;//右部字符大于两个则退出if(m[i].r==1&&m[i].a[m[i].pos]>=65&&m[i].a[m[i].pos]<=90)break;//右部字符为一个非终结符则退出if(m[i].r==2&&(m[i].a[m[i].pos]<65&&m[i].a[m[i].pos+1]<65)||(m[i].a[m[i].pos]>90&&m[i].a[m[i].pos+1]>90))break;//右部字符为两个终结符则退出if(m[i].r==2&&m[i].a[m[i].pos]>=65&&m[i].a[m[i].pos]<=90&&m[i].a[m[i].pos+1]>=65&&m[i].a[m[i].pos+1]<=90)break;////右部字符为两个非终结符则退出if(m[i].r==2&&m[i].a[m[i].pos]>=65&&m[i].a[m[i].pos]<=65&&(m[i].a[m[i].pos+1]<65||m[i].a[m[i].pos+1]>90))left++;//左推倒加1if(m[i].r==2&&(m[i].a[m[i].pos]<65||m[i].a[m[i].pos]>90)&&m[i].a[m[i].pos+1]>=65&&m[i].a[m[i].pos+1]<=90)right++;//右推倒加1if(m[i].r==1&&(m[i].a[m[i].pos]<65||m[i].a[m[i].pos]>90)){left++;right++;}//左右推倒同时加1}if(left==k||right==k)printf("此文法满足3型文法\n");}}printf("\n四元组为:\nS:");++CXI①xsrouEl'oc/xOUU6S七匚62(_诒.=£丄=11>七(++rouv「oUD」042*0OH62(O一>!._sro=Eo=llMOHS(++■—乂乂0.!|)」04oHCXIyoS2-CXI9O-S1U-_■■'9pou>-0寸一u>」elp■Mask-(++■—乂v_o.!l)」04三dur)上u_」d宀二二u>=o%==lu_」dO6A曰u>=0寸v=u>七(++■—ov_o.!l)」04M=MUr£u_」d宀二二u>=o%=£u_」do6uv=u>030399夬曰u>七(++■—ov_o.!l)」04F..u>==lu_」d_(oc>=u15%==lu_」dBb'lL+oc/x++Sprintf(”%s\n",m[i].a);}调试如下:&As&abaa-a>>>>■ci___一ssAAAM■1,11;法送文文型型12足足;WW为法法组BAb文文元呂:s:a该该四ls!lynlyt[p.S->aBS->bAA->aProcessreturned5(0x5)ezecutiantims!21.267sPressanykeytocontinue.CAUseEHWWyDesktop工古到断\臂亡法法法文文文51型型122口4足足fcdkinjl法搓法丈丈龙四元组为1S:EVr.;3BAKt:3bP:S->aBS->b/lA->a■aSProcessrelumed4(Oil)axecutionxiine;30.752sPres^4nykpytocDntinue.【小结与讨论】通过本次编译原理实验课的学习,我对于Chomsky文法类型又有了进一步的认识,并且能够借助于高级程序设计语言完成对于一组给定的产生式判断其相对应的文法类型,因为文法类型的满足是层层递进的,所以在设计程序时用到的是嵌套,此外在判断3型文法是的if判断句用的比较多,由于满足的要求比较多,所以也很容易出错。欢迎您的下载,资料仅供参考!致力为企业和个人提供
合同
劳动合同范本免费下载装修合同范本免费下载租赁合同免费下载房屋买卖合同下载劳务合同范本下载
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
,
策划
活动策划ppt下载游戏策划下载民宿策划下载游戏策划shu下载英文歌曲大赛策划免费下载
案
计划
项目进度计划表范例计划下载计划下载计划下载课程教学计划下载
书,学习
课件
超市陈列培训课件免费下载搭石ppt课件免费下载公安保密教育课件下载病媒生物防治课件 可下载高中数学必修四课件打包下载
等等打造全网一站式需求