while循环语句的翻译程序设计(简单优先法三地址输出).docVIP

  • 9
  • 0
  • 约1.7万字
  • 约 19页
  • 2019-10-24 发布于山西
  • 举报

while循环语句的翻译程序设计(简单优先法三地址输出).doc

武汉理工大学《编译原理》课程设计 PAGE 18 目录 1 问题域描述3 2 文法及属性文法的描述3 2.1 WHILE循环语句的文法3 2.2 WHILE循环语句的属性文法4 3 语法分析方法及中间代码形式的描述4 3.1语法分析方法4 3.2中间代码形式描述6 4 编译系统的概要设计7 4.1词法分析7 4.2语法制导翻译8 5 详细的算法描述8 5.1 文法设计8 5.2 算法描述8 5.3 源程序代码9 6 软件的调试过程和结果测试19 6.1调试过程19 6.2结果测试19 7 使用说明20 8 课设总结20 9 参考文献22 WHILE循环语句的翻译程序设计 (简单优先法、输出三地址表示) 1 问题域描述 while循环语句的翻译程序设计(简单优先法,输出单地址表示),要求完成: 用C++语言正确编写程序,完成WHILE循环语句的翻译程序设计。 求能正确进行词法分析,语法分析,并能正确的输出预期结果。 根据指定的文法,判定程序的正确性。 本次课程设计中要求设计一个WHILE循环语句的词法﹑语法及语义分析程序,语法分析选择简单优先法,采用语法制导翻译输出中间代码三元式。通过设计、编制、调试一个 WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现功能。 while循环语句的格式为:while(P){do A},其中A为循环体,可为一个或多个赋值语句;P为循环控制条件。while循环语句首先根据循环控制条件P进行判断,若满足条件则执行循环体A,否则执行下面的程序段; 本次课程设计中系统首先要进行词法分析,即从左到右把源文件的字符序列逐个进行扫描,产生一个个的单词序列,作为语法分析的输入从而继续编译过程。 该程序的语法分析读入词法分析的结果,并判断输入语句是否满足while循环语句的文法所描述的形式。通过简单优先法对语句进行分析,看是否能通过给定的输入串归约到文法的开始符号。在语法分析的同时进行语义分析,最后输出三元式的代码。 2 文法及属性文法的描述 2.1WHILE循环语句的文法 定义一个文法,文法G(S)如下: S- while(P){A}; A-id=E; E-TE E-+TE | -TE | e T-FT T-*FT | /FT | e F-(E) | id P-E rop id rop- | | = | = | != | == 2.2 WHILE循环语句的属性文法 产生式 语义规则 S→while P{A} S.addr:=newlabel; E.true:=newlabel; E.false:=S.next; S1.next:=S.begin; S.code:=gen(S.begin’:’‖E。code‖ gen(E.true’:’) ‖S1.code‖ gen(‘goto’ S.begin) 3 语法分析方法及中间代码形式的描述 3.1语法分析方法 3.1.1简单优先法 简单优先分析法是按照文法符号(终结符和非终结)的优先关系确定句柄的,因此我们首先介绍任意两个文法符号之间的优先关系是怎样确定的,及如何构造优先关系表。 首先定义优先关系的表示: X=Y 表示X和Y的优先关系相等 XY 表示X的优先性比Y的优先性大 XY 表示X的优先性比Y的优先性小 这样我们就可对已知文法中的任意两个文法符号X,Y按其在举行中可能会出现的相邻关系确定他们的优先关系。 3.1.2简单优先法的缺点 对文法的要求高,而且也要把文法符号的关系首先表示出来,这普遍性不是太好。 {/** S w h i l e E d o { B }a = + 1 ; ( b c ) # **/ /* S */ { N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 1 }, /* w/ { N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N }, /* h*/ { N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N }, /* i/ { N, N, N, N, 0, N, N, N, N, N, N, N, N,

文档评论(0)

1亿VIP精品文档

相关文档