IF-ELSE条件语句的翻译程序设计(LL(1)法、输出三地址表示)_2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
{