格斯文档网

您现在的位置是:格斯文档网 > 心得体会 >

编译原理语法分析实验报告

 中北大学软件学院

 实 验 报 告

  专

 业

  课程名称

  学

 号

 姓

 名

 辅导教师

  成绩

  实验日期 2014.12.03 实验时间

 10:00—11:30 1、实验名称

 语法分析器的设计与实现

 2、实验目的 掌握自上而下语法分析方法、自下而上语法分析方法

 3、实验要求 (1)实验内容:四选一

 ① 设计及实现能够识别表达式的预测分析程序。

 文法如下:

 G[E]:E->E+T|T

 T->T*F|F

 F->(E)|i

 ② 设计及实现能够识别表达式的 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<stdio.h>

 #include<string.h>

 char *action[12][6]={"S5#",NULL,NULL,"S4#",NULL,NULL,

  /*ACTION 表*/

 NULL,"S6#",NULL,NULL,NULL,"acc",

 LL(1) 文报错判 断有结读入文法开 始

 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#"};

 int goto1[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};

 char vt[6]={"i","+","*","(",")","#"};

 /*存放终结符*/

 char vn[3]={"E","T","F"};

  /*存放非终结符*/

 char*LR[7]={"M->E#","E->E+T#","E->T#","T->T*F#","T->F#","F->(E)#","F->i#"};

 /*存放产生式*/

 int a[20];//数组 a 实现状态栈

 char b[20],c[20],c1;//数组 b 实现符号栈,数组 c 存放输入的字符串

 int top1,top2,top3,top,m,n;

 int main()

 {

 int g,h,i,j,k,l,p,y,z,count;

 char x,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");

 return 0;

 }

 if(action[y][j]==NULL){

 printf("error\n");

 return 0;

 }

 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])

 return 0;

 i++;

 }

 printf("\n");

 }

 if(copy[0]=="r")

 {

 /*处理归约*/

 i=0;

 while(copy[i]!="#")//例 "S3#"

 输出 ACTION

 {

 printf("%c",copy[i])

 return 0;

 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、心得 通过本次的实验,使我真正的了解语法分析器的实现过程,让我更加深刻领悟语法分析器的实现原理。虽然在本次实验中遇到了各种各样的困难和错误,但在老师和同学们的帮助下我都一一克服了,使得语法分析器能够正确的识别相应的语法和表达式。

 在做实验的过程中,发现自己在编写程序过程中,总是会忽略各种细节,从而导致经常修改一些很小的低级错误才能使程序正常运行,不仅浪费时间,还影响对其他地方的修改,并且在很多步骤处理上,方法不正确。使结果不能符合要求,深刻体会到了自己在编程方面与别人的差距,在今后的学习中,我会注意改正自己在这方面的缺点,促使自己的编程水平不断进步。编译原理是一门专业学科,对于现阶段的我来说,只能掌握它的一些基本原理和概念,对于一些更深层的知识还是有很多难以理解的地方。但在这次实验过程中,锻炼了自己的思考能力,也锻炼了自己的动手编程能力,对于将知识的转化有了很大的帮助。

推荐访问:编译 语法 原理

版权所有:格斯文档网 2010-2024 未经授权禁止复制或建立镜像[格斯文档网]所有资源完全免费共享

Powered by 格斯文档网 © All Rights Reserved.。浙ICP备19042928号