文法判别实验报告.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
文法判别实验报告

编译原理实验报告 实验名称 文法类型的判别 学号 xxxxxxxxx 姓名 xxx 文法类型的判别 1.实验目的 输入一组文法规则,判定它是哪一种文法。 2.实验原理 乔姆斯基(Chomsky)于1956年建立形式语言的描述 他把文法分成:0型、1型、2型、3型 1)、0型文法——短语文法 设G=(VN,VT,P,S),如果它的每个产生式α  β是这样一种结构:α∈(VN∪VT)*且α至少包含一个非终结符, β∈(VN∪VT)*,则G是一个0型文法(短语结构文法、无限制文法),简称PSG。 2)、1型文法——上下文有关文法 设G=(VN,VT,P,S),如果它的每个产生式α  β均满足:|β| ≥ |α|,仅仅S  ε除外,则文法G是1型文法(上下文有关文法,上下文敏感文法),简称CSG。 3)、2型文法——上下文无关文法 设G=(VN,VT,P,S),如果它的每个产生式α  β均满足:α是一个非终结符,β∈V*,则文法G是2型文法(上下文无关文法),简称CFG。 有时将2型文法的产生式表示为A  β的形式,其中A∈VN,也就是用β取代非终结符A时,与A所在的上下文无关,因此取名为上下文无关。 4)、3型文法——正规文法 设G=(VN,VT,P,S),如果它的每个产生式A  αB或A α(A  Bα或A α),其中A和B都是非终结符,α∈VT*,则文法G是3型文法(正规文法,正则文法,有穷状态文法),简称RG。 若文法中所有的产生式均为A  αB或A α形式,则此文法为右线性的 若文法中所有的产生式均为A  Bα或A α形式,则此文法为左线性的 四个文法类的定义是逐渐增加限制的 可以看出上述4类文法,从0型到3型,产生式的限制越来越强,其后一类都是前一类的子集,而描述语言的功能越来越弱,四类文法之间的关系可表示为:0型1型2型3型 因此,每一种正规文法(3型)都是上下文无关的,每一种上下文无关文法(2型)都是上下文有关的,而每一种上下文有关文法(1型)都是0型文法。各类文法对应的语言叫各类文法语言。 例3.5-2:文法G[S]:      S  0A|1B|0   A  A0|B1|0S   B  B1|1|0 第一,左边有非终结符,所以此文法是0型文法; 第二,左边符号串长度不大于右边,所以此文法是1型文法; 第三,左边只有一个非终结符,所以此文法是2型文法; 第四,由于文法中既有左线性文法又有右线性文法,所以此 文法不是3型文法; 综上所述,此文法是2型文法。 3.实验内容 1)、输入文法的终结符(小写字母或数字)和非终结符(大写字母)以及确定识别符(规定第一输入的非终结符为识别符) 2)、输入文法的产生式的个数以及各个产生式(左部-右部) 3)、判断文法类型 4.实验代码与结果 1)、实验代码 #define _CRT_SECURE_NO_WARNINGS #include iostream #include string #include vector #include set #include algorithm #include cassert using namespace std; const int STRING_MAX_LENGTH = 10; /*一条规则*/ struct Principle { string left; string right; Principle(const char *l, const char *r) : left(l), right(r) {} }; /*文法的四元组形式,同时将该文法类型也作为其属性*/ struct Grammer { setchar Vn; setchar Vt; vectorPrinciple P; char S; int flag; // 文法类型 Grammer(void) : flag(-1) {} }; /*输入规则*/ void input(vectorPrinciple principleSet) { char left[STRING_MAX_LENGTH]; char right[STRING_MAX_LENGTH]; while (EOF != scanf(%[^-]-%s, left, right)) { getchar(); principleSe

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档