当前位置:文档之家› 自顶向下的语法分析(实验报告一)

自顶向下的语法分析(实验报告一)

武汉轻工大学
编译原理实验报告
姓名朱春桃
院(系)数学与计算机学院
班级软件工程1203
学号 1205110605
指导教师李禹生
2014 年11 月10 日
一、实验目的
完成自顶向下语法分析算法的程序设计。

二、实验内容
设计、调试并测试自顶向下语法分析算法程序。

三、设计思路
根据课堂讲授的自顶向下语法分析方法,可以根据递归下降子程序方法设计语法分析程序,也可以根据LL(1)算法设计语法分析程序,针对文法:G[E]
E→E+T | T
T→T*F | F
F→( E ) | i
(1)由于文法G[E]不满足LL(1)文法条件,需要进行必要的等价文法变换。

变换后的等价文法为:
H[E]
E→TA
A→+TA | ε
T→FB
B→*FB | ε
F→( E ) | i
(2)等价文法H[E]不含左递归,可以证明文法H[E]满足LL(1)文法条件(3)根据递归下降子程序方法设计语法分析程序
①递归程序清单
②调试过程说明
③测试语句设计
④测试结果列表
⑤测试结论分析
(4)根据LL(1)算法设计语法分析程序
①预测分析表
②预测分析程序清单
③调试过程说明
④测试语句设计
⑤测试结果列表
⑥测试结论分析
四、程序清单
/*
E->TA,
A->+TA|ε,
T->FB,
B->*FB|ε,
F->i|(E).
*/
#include<stdio.h>
void E(char str[80],int &i,int &err or);
void A(char str[80],int &i,int &error);
void T(char str[80],int &i,int &error);
void B(char str[80],int &i,int &error);
void F(char str[80],int &i,int &error);
void main()
{
int i=0,j=0,error=0;
char str[80];
printf("请输入字符串('#'为结束字符):");
while ((str[j]=getchar())!='#')
j++;
str[j]='#';
E(str,i,error);
if(error)
printf("error\n");
else
printf("right\n");
}
void E(char str[80],int &i,int &error)
{
printf("E->TA\n");
T(str,i,error);
A(str,i,error);
}
void A(char str[80],int &i,int &error)
{
if(str[i]=='+')
{
printf("A->+TA|ε\n");
i++;
T(str,i,error);
A(str,i,error);
else if (str[i]=='#'||str[i]==')'){}
else
error++;
}
void T(char str[80],int &i,int &error) {
printf("T->FB\n");
F(str,i,error);
B(str,i,error);
}
void B(char str[80],int &i,int &error) {
if (str[i]=='*')
{
printf("B->*FB|ε\n");
i++;
F(str,i,error);
B(str,i,error);
}
}
void F(char str[80],int &i,int &error) {
if (str[i]=='(')
{
printf("F->i|(E)\n");
i++;
E(str,i,error);
if(str[i]==')')
{
i++;
}
else
error++;
}
else
{
if(str[i]=='i')
{
printf("F->i|(E)\n");
i++;
}
else
error++;
}
五、测试结果
六、实验总结
实验在老师提前给出的算法指导下,完成自顶向下语法分析的程序实际上是不困难的。

但是老师的目的应该不在程序,而是让我们通过此次实验对课堂的理论知识有个深层次的理解。

所以通过本次实验,我对自顶向下的语法分析过程有了更深的了解,结合课堂知识打下了学习其他语法分析方法的基础。

相关主题