武汉理工大学《编译原理》课程设计说明书
WHILE 循环语句的翻译程序设计(简
单优先法、输出四元式)
1 需求说明或问题描述
1.1 问题描述
对 C++中 while 循环语句的理解及分析,通过编译中的词法分析、语法分析、
语义分析及中间代码生成等编译过程,用简单优先分析法分析并翻译 while 语
句。
1.2 需求说明
1 写出符合给定的语法分析方法的文法及属性文法
2 完成题目要求的中间代码四元式的描述
3 写出给定的语法分析方法的思想,完成语法分析及语义分析程序设计
4 设计若干用例,上机通过测试
2 文法及语法设计
VT={w, (, ), { ,}, i, ;}
2.1 文法及属性文法:
文法 G=(VN ,VT ,P ,S)
其中 VN={S , B, E, C, A, B, P, T}
P={
S -> w(B){E}
E -> C
C -> CA
C -> A
A -> iPA
A -> i;
P -> +|-|*|/
B -> iTi
B-> i
T -> >|<|>=|<=|==
}
2.2 语法分析方法描述及语法分析表设计
2.2.1 语法分析方法描述:
简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄
的。
基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将
1
武汉理工大学《编译原理》课程设计说明书
文法的产生式保存,设置符号栈 S,步骤如下:
(1) 将输入符号串 a1a2…an#依次逐个存入符号栈 S 中,直到遇到栈顶符号
ai 的优先性>下一个待输入符号 aj 为止。
(2) 栈顶当前符号 ai 为句柄尾,由此向左在栈中找句柄的头符号 ak,即找
到 ak-1
<
<
=
>
=
=
>
>
>
<
=
#
>
>
T
;
C
<
=
=
i
<
<
>
<
=
>
<
3.1 中间代码形式的描述
中间代码通过四元式给出。四元式的四个组成成分是:算符 op,第一和第
二运算对象 ARG1 和 ARG2 及运算结果 RESULT。运算对象和运算结果有时指用户
自己定义的变量,有时指编译程序引进的临时变量。
3.2 中间代码序列的结构设计
通过词法分析及语法分析之后,取出其中的运算表达式。对表达式进行分
析。其中,先乘除后加减,先运算括号内的。如 a=b*c+b*d 的四元式表示如下:
1)
2)
3)
4)
(*,b, c, t1)
(*, b, d, t2)
(+, t2, t3, t3)
(=, t3, -, a)
2
武汉理工大学《编译原理》课程设计说明书
4 编译系统的概要设计及部分流程图
1 通过程序,在 1.txt 文本中输入 while 语句。对文本进行扫描,通过词法
分析函数 cifa()对输入的 while 语句进行词法分析。
2 将已算好的优先关系矩阵放至程序中,通过函数 Guanxi()输出优先关系矩
阵到 guanxi.txt 文件中。
3 对已进行词法分析的 while 语句进行语法分析,分析函数为 JanDan()。其
中包含对错误语句的报错处理。同时,对可以进行四元式输出的运算表达式进行
输出。
4 通过四元式输出函数 Siyuan()将运算表达式表示为四元式的形式,输出到
siyuan.txt 文件中。
整体框图:
词法分析程序框图
3
武汉理工大学《编译原理》课程设计说明书
5 源程序与执行结果(含测试方法和测试结果)
5.1 源程序
5.1.1 词法分析函数
void cifa()//词法分析程序
{
char a[100];
char ch;
ifstream infile("1.txt",ios::in);
for(int i=0;i<100;i++)
{
infile.get(ch);
if(ch!='#')
a[i]=ch;
else {a[i]=ch;break;}
}
cout<<"词法分析结果见 cifa.txt 文
件内!"<"||JD[t]=="<"||JD[t]==">="||
JD[t]=="<="||JD[t]=="==")
R[t]='T';
4
武汉理工大学《编译原理》课程设计说明书
Panduan(a[a1-m-1],a[a1-m]);
z=
}
else z=-1;
if(z==2)
{
的句子"<=0;m--)
{
str2="\0";
str2=a[a1-m];
str=str+str2;
a[a1-m]='\0';
}
if(str==S1)
{
a[n]='S';
x=t;
coutj<<"
while(R[x])
";
//
else R[t]='i';
}
R[t]='#';
cout<<"R="<=0)
{
return;
}
else if(str==E1)
{
a[n]='E';
a1=n;
a1++;
5
武汉理工大学《编译原理》课程设计说明书
coutj<
武汉理工大学《编译原理》课程设计说明书
{
if(S[t-3]==0&&S[t-1]!=0)
{
couts<<"B"<
武汉理工大学《编译原理》课程设计说明书
结果 2:
(1)在 1.txt 中输入
while(a>=3)
{
a=1+2;
}#
(2)词法分析输出到 cifa.txt 中
关键字 while
界符为 (
标识符 a
运算符 >=
数字为 3
(3)优先分析法的规约过程
界符为 )
界符为 {
标识符 a
运算符 =
数字为 1
运算符 +
数字为 2
界符为 ;
界符为 }
(4)四元式输出
0:(>=,a,3,B0)
1:(+,1,2,T1)
2:(=,T1,-,a)
结果 2:
(1)在 1.txt 中输入
while(i>=1.112)
{
i=a;
8