- 94
- 0
- 约2.06千字
- 约 5页
- 2017-09-02 发布于浙江
- 举报
自顶向下的语法分析实验报告一
武汉轻工大学
编译原理实验报告
姓 名 朱春桃
院 (系) 数学与计算机学院
班 级 软件工程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).
*/
#includestdio.h
void E(char str[80],int i,int error);
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++;
}
}
测试结果
实验总结
实验在老师提前给出的算法指导下,完成自顶向下语法分析的程序实际上是不困难的。但是老师的目的应该不在程序,而是让我们通过此次实验对课堂的理论知识有个深层次的理解。所以通过本次实验,我对自顶向下的语法分析过程有了更深的了解,结合课堂知识打下了学习其他语法分析方法的基础。
原创力文档

文档评论(0)