编译原理实验四:正规式到正规文法的转换解读.doc

编译原理实验四:正规式到正规文法的转换解读.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验四:正规式到正规文法的转换 一:要求 输入任意的正规式,输出相应的正规文法 二:实验目的 熟练掌握正规式到正规文法的转换规则 理解正规文法和正规式的等价性 三:实验原理 1.一个正规语言可以由正规文法定义,也可以由正规式定义,对任意一个正规文法,存在一个定义同一个语言的正规式,反之,对每个正规式,存在生成同一个语言的正规文法 2正规文法与正规式的转换规则: 1. A-〉xB,B-y则:A=xy 2.A-〉xA,A-y 则:A-〉x*y 3.A-〉x,A-〉y 则:A=x|y 四:数据结构与算法 struct Chomsky { string left; string right; }; void apart(Chomsky *p,int i) //分开产生式左右部 void VNVT(Chomsky *p)//求VN和VT void print(Chomsky *p)//输出四元组,即正规文法 void change(Chomsky *p)//正规式到正规文法的转换函数 五:出错分析 1: 自定义的变量容易弄混,注释清楚很重要。很容易导致没有定义这种错误。 2:if条件判断内容不明确,字符串的分段获取不清楚。 3:程序没有写出来,实验失败。 六:实验结果与分析 七:源代码 #includeiostream #includestring using namespace std; #define max 50 int NONE=1; int RELEFT=1; string strings,noend,end;//非终结符与终结符存储 string r;//正规式 int m=1;//记录产生式的个数 struct Chomsky//正规文法结构存储 { string left; string right; }; void apart(Chomsky *p,int i) //分开产生式左右部 { int j; for(j=0;jstrings.length();j++) if(strings[j]==-) { p[i].left=strings.substr(0,j); p[i].right=strings.substr(j+1,strings.length()-j); } } void VNVT(Chomsky *p)//求VN和VT { int i,j; for(i=0;im;i++) { for(j=0;j(int)p[i].left.length();j++) { if((p[i].left[j]=Ap[i].left[j]=Z))//非终结符判断 { if(noend.find(p[i].left[j])100) noend+=p[i].left[j]; } else { if(end.find(p[i].left[j])100) end+=p[i].left[j]; } } for(j=0;j(int)p[i].right.length();j++) { if(!(p[i].right[j]=Ap[i].right[j]=Z))//终结符判断 { if(end.find(p[i].right[j])100) end+=p[i].right[j]; } else { if(noend.find(p[i].right[j])100) noend+=p[i].right[j]; } } } } void print(Chomsky *p)//输出四元组 { int i; coutendlG=({noend},{end},P,noend[0]),其中P由下列产生式组成:endl; for(i=0;im;i++) coutp[i].left-p[i].rightendl; } void change(string q)//正规式到正规文法的转换函数 { /*char S;//文法开始符号 p[0].left=S;//将正规式r重写为S-r形式存储在正规文法的第一条 p[0].right=q; int n;//记录文法右边的长度 n=p[0].right.length; for(int i=0;in;i++) { if(p[0].right.[i]==) }*/ } void main() { int i,j; cout...............

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档