欢迎来到天天文库
浏览记录
ID:52864336
大小:37.89 KB
页数:12页
时间:2020-03-31
《编译原理实验1文法类型判断.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、学号L专业网络工程姓名黄武伟实验日期2018/4/11教师签字成绩实验报告【实验名称】文法类型的判断和推导序列的生成【实验目的】输入:一组任意的文法规则和任意符号串输出:相应的Chomsky文法类型和推导【实验要求】(1)文法的输入应简便(不代表产生式少)(2)指明是哪一类Chomsky文法,给出相应的四元组形式(为方便起见,不考虑0型文法)(3)给出清晰的推导序列,并判断输入的符号串是否为该文法的句型以下为判断文法类型代码段:intyi=1,er=1,left=0,right=0;for(i=0;i2、+){if(m[i].r1)er=0;}if(er==1){printf("该文法满足2型文法");在满足1型文法的基础上若左边字符串个数为1则满足2型文法,在此设置一个标志位,当有一个产生式不满足此条件时标志位置0则不满足1型文法。for(i3、=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)4、5、(m[i].a[m[i].pos]>90&&m[i].a[m[i].pos+1]>90))break;//右部字符为两个终结符则退出if(m[i].r=6、=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]<657、8、m[i].a[m[i].pos+1]>90))left++;//左推倒加1if(m[i].r==2&&(m[i].9、a[m[i].pos]<6510、11、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]<6512、13、m[i].a[m[i].pos]>90)){left++;right++;}//左右推倒同时加1}if(left==k14、15、right==k)printf("此文法满足3型文法");}}源代码如下:#includetyped16、efstruct{chara[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("");/*for(j=17、0;j<10;j++){printf("%s",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]==' ')break;if(m[i].a[j]=='-'){thu=1;j++;m[i18、].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)19、20、(m[i].a
2、+){if(m[i].r1)er=0;}if(er==1){printf("该文法满足2型文法");在满足1型文法的基础上若左边字符串个数为1则满足2型文法,在此设置一个标志位,当有一个产生式不满足此条件时标志位置0则不满足1型文法。for(i
3、=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)
4、
5、(m[i].a[m[i].pos]>90&&m[i].a[m[i].pos+1]>90))break;//右部字符为两个终结符则退出if(m[i].r=
6、=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
7、
8、m[i].a[m[i].pos+1]>90))left++;//左推倒加1if(m[i].r==2&&(m[i].
9、a[m[i].pos]<65
10、
11、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
12、
13、m[i].a[m[i].pos]>90)){left++;right++;}//左右推倒同时加1}if(left==k
14、
15、right==k)printf("此文法满足3型文法");}}源代码如下:#includetyped
16、efstruct{chara[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("");/*for(j=
17、0;j<10;j++){printf("%s",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]==' ')break;if(m[i].a[j]=='-'){thu=1;j++;m[i
18、].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)
19、
20、(m[i].a
此文档下载收益归作者所有