IF-ELSE条件语句的翻译程序设计(LL(1)法、输出三地址表示)_2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

IF-ELSE条件语句的翻译程序设计

1 问题描述

要求用LL(1)自顶向下分析方法及三地址中间代码,对IF-THEN-ELSE条件语句完成编译各阶段过程,包括词法、语法、语义等分析。

2 问题分析及编译系统的概要设计

编译过程一般分为六个阶段的过程,可以由六个模块完成,它们称为词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序,此外,一个完整编译程序还必须包括“表格管理程序”和“出错处理程序”。

这次实验涉及到词法分析、语法分析、语义分析及表格管理和出错管理。其中,词法分析至少要能识别关键字“if”、“then”和“else”,标识符(即自定义变量),数字,和运算符等等;语法分析要分析程序结构的合法性,即是否为文法的句子;语义分析要能够语法制导翻译出中间代码(三地址)并将其输出;表格管理是指符号表;出错处理是指在语法分析时,所有非文法句子的错误类型处理.

3 文法及属性文法的定义

3.1 文法:

文法是用于描述语言的语法结构的形式规则(即语法规则)。这些规则必须是准确的、易于理解的以及有相当强的描述能力。由这种规则所产生的程序语言应有利于句子分析和翻译,而且,最好能通过这些规则自动产生有效的语法分析程序.

IF-ELSE条件语句的文法如下所示:

0.A->EB

1.B->+EB|-EB|ε

2.E->FT

3.T->*FT|/FT|ε

4.F->i|(E)

或者能够更简洁一点:

0.S->if A THEN B ELSE C

1.A->m rop n

2.B->x=m arop n

3.C->x=n arop m

4.rop->=|<|>

5.arop->+|-|*|/

3.2 属性文法:

属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或者非终结符)配备若干相关的“值”(与文法符号相关的属性)。

在一个属性文法中,对应于每个产生式A→a都有一套与之相关联的语义规则,每规

则的形式为:b:=f(c

1,c

2

,…,c

k

)其中f是一个函数,而且或者①b是A的一个综合属性

并且c

1,c

2

,…,c

k

是产生式右边文法符号的属性或者②非终结符既可有综合属性也可有

继属性,文法开始符号的所有继承属性作为属性计算前的初始值。

属性文法为:

if(VT[opr]=='=') //{"="判断};

{

arr[d][1]=arr_i[opd];

arr[d][0]='=';

arr[d][2]=id;

arr[d][3]=' ';

arr[d][4]=' ';

id++;

}

else if(VT[opr]=='>') //{">"判断};

{

arr[d][1]=arr_i[opd];

arr[d][0]='>';

arr[d][2]=id;

arr[d][3]=' ';

arr[d][4]=' ';

id++;

}

else if(VT[opr]=='<') //{"<"判断}; {

arr[d][1]=arr_i[opd];

arr[d][0]='<';

arr[d][2]=id;

arr[d][3]=' ';

arr[d][4]=' ';

id++;

}

else if(VT[opr]=='+') //{"+"判断}; {

arr[d][1]=arr_i[opd];

arr[d][0]='+';

arr[d][2]=id;

arr[d][3]=' ';

arr[d][4]=' ';

id++;

}

else if(VT[opr]=='-') //{"-"判断}; {

arr[d][1]=arr_i[opd];

arr[d][0]='-';

arr[d][2]=id;

arr[d][3]=' ';

arr[d][4]=' ';

id++;

}

else if(VT[opr]=='*') //{"*"判断}; {

arr[d][1]=arr_i[opd];

arr[d][0]='*';

arr[d][2]=id;

arr[d][3]=' ';

arr[d][4]=' ';

id++;

}

else if(VT[opr]=='/') //{"/"判断};

{

arr[d][1]=arr_i[opd];

arr[d][0]='/';

arr[d][2]=id;

arr[d][3]=' ';

arr[d][4]=' ';

id++;

}

else if(opr==-2) //{其他字符判断};

{

arr[d][1]=id-1;

arr[d][0]=' ';

arr[d][2]=arr_i[opd];

arr[d][3]=' ';

arr[d][4]=' ';

}

else

if(VT[opr]!='<'&&VT[opr]!='>'&&VT[opr]!='+'&&VT[opr]!='-'&&VT[opr]!='*'&&VT[opr]!='/')//{"#"结束符判断};

arr[d][1]=id-1;

{

相关文档
最新文档