网站大量收购独家精品文档,联系QQ:2885784924

递归下降分析程序实现——编译原理课程设计报告.doc

递归下降分析程序实现——编译原理课程设计报告.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
课程设计报告 设计题目 17.递归下降分析程序的实现 设计要求 对文法 G: E→E+T|T T→T*F|F F→(E)|i 构造出G的递归下降分析程序。程序显示输出匹配过程(即自上而下生成语法分析树的步骤,输出各匹配产生式序号即可)。 设计思路 (1)分析 a) ∵E=E+T=E+T*F=E+T*(E)即有E=E+T*(E)存在左递归。用直接改写法消除左递归,得到如下: E ( TE’ E’ ( +TE’ | ?TE’|ε T ( FT’ T’ ( *FT’ | /FT’|ε F ( (E) | i b) 对于以上改进的方法。可得: 对于E’:? FIRST( E’ )=FIRST(+TE’)∪FIRST(-TE’)∪{ε}={+,?,ε} 对于T’: FIRST( T’ )=FIRST(*FT’)∪FIRST(/FT’)∪{ε}={*,∕,ε} 而且: FIRST( E ) = FIRST( T ) = FIRST( F )=FIRST((E))∪FIRST(i)={(,i } 由此得出各非终结符的FOLLOW集合如下: FOLLOW( E )= { ),#} FOLLOW(E’)= FOLLOW(E)={ ),#} FOLLOW( T )= FIRST(E’)\ε∪FOLLOW(E’)={+,?,),#} FOLLOW( T’ ) = FOLLOW( T ) ={+,?,),#} FOLLOW( F )=FIRST(T’)\ε∪FOLLOW(T’)={*,∕,+,?,),#} 由以上FOLLOW集可以我们可以得出SELECT集如下: 对E SELECT(E(TE’)=FIRST(TE’)=FIRST(T)={ (,i } 对E’ SELECT(E’(+TE’)={ + } SELECT(E’( ?TE’)={ ? } SELECT(E’(ε)={ε,),#} 对T SELECT(T(FT’)={(,i} 对T’ SELECT(T’(*FT’)={ * } SELECT(T’( ∕FT’)={ ∕ } SELECT(T’(ε)={ε,+,?,),#} 对F SELECT(F((E) )={ ( } SELECT(F(i)={ i } ∴SELECT(E’(+TE’)∩SELECT(E’( ?TE’)∩SELECT(E’(ε)=( SELECT(T’(*FT’)∩SELECT(T’( ∕FT’)∩SELECT(T’(ε)=( SELECT(F((E) )∩SELECT(F(i)= ( 由上可知,有相同左部产生式的SELECT集合的交集为空,所以文法是LL(1)文法。因此,转化后的文法可以用递归下降分析法作语法分析。 (2)设计 这里采用递归下降分析法形象描述递归子程序。程序中将要用到的几个重要数据如下: 一个全局变量ch,存放由文件输入得到的字符。 一个函数宏READ(ch),实现读取文件中的字符。 五个子函数:P(E)、P(E’)、P(T)、P(T’)、P(F)。 课程设计源程序 /************************************************************************ * 文件描述:递归下降语法分析器。分析如下方法: * E-E+T | E-T | T * T-T*F | T/F |F * F-(E) | i * * 输入:每行含一个表达式的文本文件。 * 输出:分析成功或不成功信息。 * 创建人:赵有斌 ***********************************************************************/ ? #includestdio.h #includemalloc.h #define READ(ch) ch=getc(fp) /*宏:READ(ch)*/ char ch; /*声明为全局变量*/ int right=0; FILE *fp; structstruCH{ char ch; struct struCH *next; }struCH,*temp,*head,*shift; /*head指向字符线性链表的头结点*/ /*shift指向动态建成的结点(游标)*/ void main(intargc,char *argv[]){ void E (); /* P(E) */ void E1(); /* P(E)*/ void T (); /* P(T) */ void T1(); /* P(T)*/ void F (); /* P(F) */ i

文档评论(0)

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

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

1亿VIP精品文档

相关文档