第1题编译器中若干基本功能的实现V3.0.docVIP

第1题编译器中若干基本功能的实现V3.0.doc

  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文档。上传文档
查看更多
第1题编译器中若干基本功能的实现V3.0

编译器中若干基本功能的实现 【问题描述】 编译器实现技术是一大宝库,一方面以编译器的实现为背景可以实践几乎全部在数据结构与算法分析课程中学到的主要数据结构与算法;另一方面,编译器设计中使用的问题求解方法、处理问题的思路【实现提示】【输入】 【输出】【实现提示】 (1)G为一个四元组: G = (VT,VN,P,S) VT:终结符(Terminal)集 VN:非终结符(Variable)集,VT∩VN=Φ S: 开始符号(Start Symbol),S∈VN P: 产生式(Product)集合 α→β,被称为产生式(定义式),读作:α定义为β。其中α∈(VT∪VN)+,且α中至少有VN中元素的一个出现。β∈(VT∪VN)*。α称为产生式α→β的左部(Left Part),β称为产生式α→β的右部(Right Part) 。 () A→γ是文法G的一个产生式,且α、β∈(VT∪VN)*, 称αAβ的直接推导/派生(Derive)出αγβ,也称 αγβ直接归约(Reduce)为αAβ。 注意到是根据A→γ而将αγβ中的γ变成了A,所以,一般称将γ归约为A 记为 αAβ(αγβ( αγβ ( αAβ ) (3)最左推导: 每次推导都施加在句型的最左边的语法变量上——与最右归约对应; (4)语法(分析)树: (Parse Tree,又称语法分析树或分析树) 用树的形式表示句型的结构 树根: 开始符号 中间结点: 非终结符 叶结点: 终结符或者非终结符 每个推导对应一个中间结点及其儿子——一个二级子树-直接短语 显然,如果一个中间结点v标记为A,v的儿子从左到右依次为v1,v2,……,vn,并且它们分别标记为X1,X2,……,Xn,则A(X1X2……Xn∈P 设有文法G的一棵语法树T, T的所有叶子顶点从左到右依次标记为X1,X2,…,Xn,则称符号串X1X2…Xn是T的结果(Yield) (5)二义性(歧义性): 形象地看,就是一个句子(如:id+id*id) 即有如下两个不同的最左推导: 如果一个文法的句子存在两棵分析树,那么,该句子是二义性的;如果一个文法包含二义性的句子,则称这个文法是二义性的; 否则,该文法是无二义性的。 (a) 一般来说,高级程序设计语言存在无二义性文法,但有时用二义性文法。如:表达式文法、条件语句文法     E→E+E|E-E|E*E|E/E|( E )| id S( if expr then S (if expr then S else S ( other 二义性的句子: if e1 then if e2 then s1 else s2 (b) 对于任意一个CFG,不存在算法判定它是无二义性的;但能给出一组充分条件,满足这组充分条件的文法是无二义性的。 2、示例与数据结构的选择提示 (1)语法分析树的建立 例:设算术表达式的文法G[E]: E::=E+T|E-T|T T::=T*F|T/F|F F::=(E) |i 试以输入符号串i+i*i(G[E]的句子)为例,讨论语法分析树的生成。 如前所述,可为输入符号串i+i*i构造下列推导: E=E+T=T+T=F+T=i+T=i+T*F=i+F*F=i+i*F=i+i*i。 由此推导有相应的语法分析树如图1所示。 图① 语法分析树由结点与边组成,每个结点对应于一个文法符号。为了确定语法分析树的结构,显然,只需确定每个结点在语法分析树中的位置,包括各个节点之间的相互关系。因此,语法分析树的结点的数据结构可设计如下: typedef struct { int 结点序号; int 文法符号序号; int 父结点序号; int 左兄结点序号; int 右子结点序号; } 结点类型; 语法分析树的数据结构可设计如下: 结点类型 语法分析树[MaxNodeNum]; 另外设置一个变量,记录语法分析树中结点的总数。 这样,对于图①中的语法分析树可如下表所示: 如果按照此表所提供各结点的信息来画出语法分析树,得到的结果与图①的完全一样。 (2)句子的生成 这里考虑如何利用计算机实现应用推导生成文法的句子。 例:设文法G[E]: E::=E+T|E-T|T T::=T*F|T/F|F F::=(E) |i 试以句子i+i/i的生成为例讨论实现问题。 不难构造如下的推导(最左推导): E=E+T=T+T=F+T=i+T=i+T/F=i+F/F=i+i/F=i+i/i 最终所推导得到的终结符号串便是句子。 首先考虑相关的数据结构。推导中每一个句型都是一个符号串,但其长度可变,宜用链表结构,例如

文档评论(0)

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

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

1亿VIP精品文档

相关文档