FIRSTVT实验示例.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文档。上传文档
查看更多
FIRSTVT实验示例FIRSTVT实验示例

编译原理FRSTVT实验报告 实验要求 算符优先文法是自低向上语法分析的一个很有效地方法.本次设计的主要要求是输入一个算符优先文法,然后将它的FIRSTVT集合求出来. 实现过程 实验原理 自下而上分析法就是从输入串开始,逐步进行”归约”,直至归约到文法的开始符号;或者说,从语法树的末端开始,步步向上”归约”,直到根结.这里提到的自上而下的分析方法是一种”移进-归约”法.这种方法的大意是,用一个寄存符号的先进后出栈,把符号一个一个地移进到栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶这一部分替换成(规约成)该产生式的左部符号. 要使用这种”移进-归约”的方法,必须要对文法做一些限制.这里就提到使用算符优先文法.这种算符优先分析是定义算符之间(确切地说,终结符之间)的某种优先关系,借助于这种优先关系寻找”可归约串”和进行归约. 一个文法,如果它的人和一产生式的左部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部: …QR… 则我们称这种文法为算法文法. 假定G是一个不含ε-产生是的算服文法.对于任何一个终结符a,b,我么说: (1) a=b 当且仅当文法G中含有形如P-…ab…或P-…aQb…的产生式; (2) ab 当且仅当文法G中含有形如P-…aR…的产生式,而且R=b…或者R=Qb…; (3) ab 当且仅当文法G中含有形如P-…Rb…的产生式,而且R=…a或者R=…aQ. 如果一个算符文法G中的任何终结符对(a,b)至少满足下述三种关系之一: a=b,ab,ab 则称G这种文法是算符优先文法. 通过检查G的每个产生式的每个候选式,可找到所有满足a=b的终结符对.为了找到所有满足关系和的终结符对,我们首先需要对G的每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P): FIRSTVT(P)={a|P=a…或者P=Qa…,a∈VT而Q∈VN} LASTVT(P)={a|P=…a或者P=…aQ,a∈VT而Q∈VN} 有了这两个集合之后,就可以通过检查每个产生式的候选式确定满足关系和的所有终结符对.我们可以用下面两条规则来构造集合FIRSTVY(P): (1) 若有产生式P-a…或P-Qa…,则a∈FIRSTVT(P); (2) 若a∈FIRSTVT(Q),且有产生式P-Q…,则a∈FIRSTVT(P). 因此只要按照这样的构造过程,最终就可以得到某个文法的所有非终结符的FIRSTVT和LASTVT集合. 算法构造 我将这个程序分为三个部分来处理.第一部分是从文本文件中将某个算符优先文法读入,并将它结构化,存入一个结构中.第二部分是对这个结构进行分析处理,得到它的FIRSTVT集合,存入一个数组中.最后一部分将这个数组的数组的内容输出. 第一部分可现将算符文法存入名为test的文本文件中,然后通过一个函数去逐行分析这个文本,提取出所有的终结符,非终结符,产生式左边和右边等等有用信息(具体的文本格式后面有说明),并将这些数据存入相应的数据结构中.我是分别使用一个结构体数组存放每个产生式的左边,结构体数组的每项右生成一个链表来存放产生式的右边.再用两个链表存放所有的终结符和非终结符. 例如某个算符优先文法G定义如下: (1)E-E+T|T (2)T-T*F|F (3)F-P^F|P (4)P-(E)|i 经过第一步,应该生成如下的数据结构: 经过第一部分的数据结构化,第二部分就是对他进行分析了.这里采用书本上提到的一个利用STACK的方法.首先建立一个布尔数组F[P,a],使得F[P,a]为真的条件是,当且仅当a∈FIRSTVT(P).开始时,按上述的规则(1)对每个数组元素F[P,a]赋初值.我们用一个栈STACK,把所有初值为真的数组元素F[P,a]的符号对(P,a)全都放在STACK中.然后对STACK施行如下运算. 如果STACK不空,就将栈顶项逐出,计此项为(Q,a).对于每个形如P-Q…的产生式,若F[P,a]为假,则变其值为真且将(P,a)推进STACK栈.下面是这算法的程序: PROCEDURE INSERT(P,a); IF NOT F[P,a] THEN BEGIN F[P,a]:=TRUE;把(P,a)下推入STACK栈END; 下面是主程序: BEGIN FOR 每个非终结符P和每个终结符a,DO F[P,a]:=FALSE; FOR 每个形如P-a…或者P-Qa…的产生式DO INSERT(P,a); WHILE STACK 非空 DO BEGIN 把STACK的栈顶项,计为(Q,a),上托出去; FOR 每条形如P-Q…的产生式DO INSERT(P,a); END OF WHILE; END 这个算法的工作结果

文档评论(0)

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

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

1亿VIP精品文档

相关文档