编译原理 语法分析实验报告.docx
- 文档编号:18625170
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:11
- 大小:157.12KB
编译原理 语法分析实验报告.docx
《编译原理 语法分析实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理 语法分析实验报告.docx(11页珍藏版)》请在冰点文库上搜索。
编译原理语法分析实验报告
中北大学软件学院
实验报告
专业
课程名称
学号
姓名
辅导教师成绩
实验日期
2014.12.03
实验时间
10:
00—11:
30
1、实验名称语法分析器的设计与实现
2、实验目的
掌握自上而下语法分析方法、自下而上语法分析方法
3、实验要求
(1)实验内容:
四选一
1设计及实现能够识别表达式的预测分析程序。
文法如下:
G[E]:
E->E+T|T
T->T*F|F
F->(E)|i
2设计及实现能够识别表达式的LR分析程序。
文法如下:
G[E]:
E->E+T|T
T->T*F|F
F->(E)|i
③设计及实现能够识别表达式的算符优先分析程序。
文法如下:
G[E]:
E->E+T|T
T->T*F|F
F->P↑F|P
P->(E)|i
④设计及实现计算表达式的计算器。
表达式中可包含+、-、*、/、(、)运算符。
(2)实验要求:
对已给的一个二元式形式表达式,能够检查有无语法错误。
并指定出错位置。
将表达式的语法树输出(或将语法分析过程输出)。
4、实验原理
根据自上而下和自下而上的语法分析思想实现语法分析程序。
5、实验步骤
(1)根据文法构造语法分析表。
(2)编写总控程序实现语法分析。
6、状态转换图及词法分析程序
(1)状态转换图
否
(2)语法分析器源代码
#include
#include
char*action[12][6]={"S5#",NULL,NULL,"S4#",NULL,NULL,/*ACTION表*/
NULL,"S6#",NULL,NULL,NULL,"acc",
NULL,"r2#","S7#",NULL,"r2#","r2#",
NULL,"r4#","r4#",NULL,"r4#","r4#",
"S5#",NULL,NULL,"S4#",NULL,NULL,
NULL,"r6#","r6#",NULL,"r6#","r6#",
"S5#",NULL,NULL,"S4#",NULL,NULL,
"S5#",NULL,NULL,"S4#",NULL,NULL,
NULL,"S6#",NULL,NULL,"S11#",NULL,
NULL,"r1#","S7#",NULL,"r1#","r1#",
NULL,"r3#","r3#",NULL,"r3#","r3#",
NULL,"r5#","r5#",NULL,"r5#","r5#"};
intgoto1[12][3]={1,2,3,/*QOTO表*/
0,0,0,
0,0,0,
0,0,0,
8,2,3,
0,0,0,
0,9,3,
0,0,10,
0,0,0,
0,0,0,
0,0,0,
0,0,0};
charvt[6]={'i','+','*','(',')','#'};/*存放终结符*/
charvn[3]={'E','T','F'};/*存放非终结符*/
char*LR[7]={"M->E#","E->E+T#","E->T#","T->T*F#","T->F#","F->(E)#","F->i#"};/*存放产生式*/
inta[20];//数组a实现状态栈
charb[20],c[20],c1;//数组b实现符号栈,数组c存放输入的字符串
inttop1,top2,top3,top,m,n;
intmain()
{
intg,h,i,j,k,l,p,y,z,count;
charx,copy[20],copy1[20];
top1=0;top2=0;top3=0;top=0;
a[0]=0;y=a[0];b[0]='#';
count=0;z=0;
//输入要识别的字符串
printf("请输入表达式\n");
do{
scanf("%c",&c1);
c[top3]=c1;//字符数组c[10]存放输入的字符串
top3=top3+1;//最后top3=5
}while(c1!
='#');
//输出分析结果
printf("步骤\t状态栈\t\t符号栈\t\t输入串\t\tACTION\tGOTO\n");
do{
y=z;m=0;n=0;/*y,z指向状态栈栈顶*/
g=top;j=0;k=0;
x=c[top];//将输入符号赋给x
count++;
printf("%d\t",count);//输出步骤序号
while(m<=top1)
{/*输出状态栈*/
printf("%d",a[m]);
m=m+1;
}
printf("\t\t");
while(n<=top2)
{/*输出符号栈*/
printf("%c",b[n]);
n=n+1;
}
printf("\t\t");
while(g<=top3)
{/*输出输入串*/
printf("%c",c[g]);
g=g+1;
}
printf("\t\t");
while(x!
=vt[j]&&j<=5)//获取当前x对应j的值
j++;
if(j==5&&x!
=vt[j])//如果x不是终结符则报错
{
printf("error\n");
return0;
}
if(action[y][j]==NULL){
printf("error\n");
return0;
}
else
strcpy(copy,action[y][j]);
if(copy[0]=='S')
{/*处理移进*/
z=copy[1]-'0';//因为状态从0开始
top1=top1+1;
top2=top2+1;
a[top1]=z;//数组a实现状态栈
b[top2]=x;//数组b实现符号栈
top=top+1;//输入符号串数组c的顶
i=0;
while(copy[i]!
='#')//例"S3#"输出ACTION
{
printf("%c",copy[i])
return0;
i++;
}
printf("\n");
}
if(copy[0]=='r')
{/*处理归约*/
i=0;
while(copy[i]!
='#')//例"S3#"输出ACTION
{
printf("%c",copy[i])
return0;
i++;
}
h=copy[1]-'0';//因为状态从0开始
strcpy(copy1,LR[h]);
while(copy1[0]!
=vn[k])//获取当前k值
k++;
l=strlen(LR[h])-4;
top1=top1-l+1;
top2=top2-l+1;
y=a[top1-1];
p=goto1[y][k];
a[top1]=p;
b[top2]=copy1[0];
z=p;
printf("\t");
printf("%d\n",p);
}
}while(action[y][j]!
="acc");
printf("acc\n");
getchar();
}
7、测试及结果
确定是否为LL
(1)文法
8、心得
通过本次的实验,使我真正的了解语法分析器的实现过程,让我更加深刻领悟语法分析器的实现原理。
虽然在本次实验中遇到了各种各样的困难和错误,但在老师和同学们的帮助下我都一一克服了,使得语法分析器能够正确的识别相应的语法和表达式。
在做实验的过程中,发现自己在编写程序过程中,总是会忽略各种细节,从而导致经常修改一些很小的低级错误才能使程序正常运行,不仅浪费时间,还影响对其他地方的修改,并且在很多步骤处理上,方法不正确。
使结果不能符合要求,深刻体会到了自己在编程方面与别人的差距,在今后的学习中,我会注意改正自己在这方面的缺点,促使自己的编程水平不断进步。
编译原理是一门专业学科,对于现阶段的我来说,只能掌握它的一些基本原理和概念,对于一些更深层的知识还是有很多难以理解的地方。
但在这次实验过程中,锻炼了自己的思考能力,也锻炼了自己的动手编程能力,对于将知识的转化有了很大的帮助。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 语法分析实验报告 编译 原理 语法分析 实验 报告