首页 范文大全 古典文学 职场知识 中国文学 公文书信 外国名著 寓言童话 百家讲坛 散文/诗歌 美文欣赏 礼仪知识 民俗风情
  • 范文大全
  • 古典文学
  • 职场知识
  • 中国文学
  • 公文书信
  • 外国名著
  • 寓言童话
  • 百家讲坛
  • 散文/诗歌
  • 美文欣赏
  • 礼仪知识
  • 民俗风情
  • 谜语大全
  • 名言警句
  • 编译原理语法分析实验报告

    时间:2020-07-19 11:44:22 来源:蒲公英阅读网 本文已影响 蒲公英阅读网手机站

    相关热词搜索:编译 语法 原理

     中北大学软件学院

     实 验 报 告

      专

     业

      课程名称

      学

     号

     姓

     名

     辅导教师

      成绩

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

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

    • 范文大全
    • 职场知识
    • 精美散文
    • 名著
    • 讲坛
    • 诗歌
    • 礼仪知识