语法分析器原理_编译原理实验报告(词法分析器-语法分析器)

 精品文档

 编

 译

 原

 理

 实

 验

 报

 告

 实验一

 一、实验名称:词法分析器的设计

 二、实验目的:1,词法分析器能够识别简单语言的单词符号

  2,识别出并输出简单语言的基本字.标示符.无符号整数.运算符.和界符。

 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器

 四、实验原理:

 1、词法分析程序的算法思想

 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

 2、程序流程图

 (1)主程序

 输入要分析的语句

 输入要分析的语句

 调用扫描、分析程序

 输出单词符号二元组

 结束

 判断读入字符是否为“#”

 (2)扫描子程序

 T

 Token清空

 当前字符=?

 标示符

 常数

 表中查找

 结束

 Error()

 输出二元式

 基本字

 用户标示符

 结束

 Get()

 3、各种单词符号对应的种别码

 单词符号

 种别码

 助记符

 内码值

 while

 1

 while

 -

 if

 2

 if

 -

 else

 3

 else

 -

 switch

 4

 switch

 -

 case

 5

 case

 -

 标识符

 6

 id

 id在符号表中的位置

 常数

 7

 num

 num在常数表中的位置

 +

 8

 +

 -

 -

 9

 -

 -

 *

 10

 *

 -

 <=

 11

 relop

 LE

 <

 11

 relop

 LT

 ==

 11

 relop

 EQ

 =

 12

 =

 -

 ;

 13

 ;

 -

 五、实验内容:

 1、实验分析

 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k(int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用来表示正在分析的字符。字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。

 2 实验词法分析器源程序:

 #include <stdio.h>

 #include <math.h>

 #include <string.h>

 int i,j,k;

 char c,s,a[20],token[20]={'0'};

 int letter(char s){

  if((s>=97)&&(s<=122)) return(1);

  else return(0);

 }

 int digit(char s){

  if((s>=48)&&(s<=57)) return(1);

  else return(0);

 }

 void get(){

  s=a[i];

  i=i+1;

 }

 void retract(){

  i=i-1;

 }

 int lookup(char token[20]){

  if(strcmp(token,"while")==0) return(1);

  else if(strcmp(token,"if")==0) return(2);

  else if(strcmp(token,"else")==0) return(3);

  else if(strcmp(token,"switch")==0) return(4);

  else if(strcmp(token,"case")==0) return(5);

  else return(0);

 }

 void main()

 {

  printf("please input string :\n");

  i=0;

  do{i=i+1;

  scanf("%c",&a[i]);

  }while(a[i]!='#');

  i=1;

  j=0;

  get();

  while(s!='#'){ memset(token,0,20);

  switch(s)

  {

  case 'a':

  case 'b':

  case 'c':

  case 'd':

  case 'e':

  case 'f':

  case 'g':

  case 'h':

  case 'i':

  case 'j':

  case 'k':

  case 'l':

  case 'm':

  case 'n':

  case 'o':

  case 'p':

  case 'q':

  case 'r':

  case 's':

  case 't':

  case 'u':

  case 'v':

  case 'w':

  case 'x':

  case 'y':

  case 'z':

  while(letter(s)||digit(s))

  {token[j]=s;

  j=j+1;

  get();

  }

  retract();k=lookup(token);

  if(k==0)

  printf("(%d,%s)",6,token);

  else printf("(%d,-)",k);

  break;

  case '0':

  case '1':

  case '2':

  case '3':

  case '4':

  case '5':

  case '6':

  case '7':

  case '8':

  case '9':

  while(digit(s)){

  token[j]=s;

  j=j+1;

  get();

  }

  retract();

  printf("%d,%s",7,token);

  break;

  case '+':printf("('+',NULL)");break;

  case '-':printf("('-',null)");break;

  case '*':printf("('*',null)");break;

  case '<':get();

  if(s=='=') printf("(relop,LE)");

  else{retract();

  printf("(relop,LT)");

  }

  break;

  case '=':

  get();

  if(s=='=')

  printf("(relop,EQ)");

  else{

  retract();

  printf("('=',null)");

  }

  break;

  case ';':

  printf("(;,null)");

  break;

  case ' ':break;

  default:printf("!\n");

  }

  j=0;

 get();

  } }

 六:实验结果:

  实验二

 实验名称:语法分析器的设计

 实验目的:

 用C语言编写对一个算术表达式实现语法分析的语法分析程序,并以四元式的形式输出,以加深对语法语义分析原理的理解,掌握语法分析程序的实现方法和技术。

 三、 实验原理:

 1、算术表达式语法分析程序的算法思想

 首先通过关系图法构造出终结符间的左右优先函数f(a),g(a)。在分析的过程中,通过左右优先函数比较当前读入终结符与前一个读入终结符间的优先关系,分析后适时的以四元式形式输出相关的符号。

 2、通过优先函数关系图构造优先函数

 优先函数表

 +

 *

 i

 (

 )

 f

 4

 6

 6

 2

 6

 g

 3

 5

 7

 7

 2

 f*

 f*

 fi

 f(

 f)

 g+

 g)

 g*

 gi

 g(

 f+

 四、实验内容:

 1、实验分析

 本实验所用文法是: G[E]:E->E+E|E-E|E*E|E/E|(E)

 E->0|1|2|3|……|9

 根据此文法编写程序时,算术表达式的求解过程需要用到算术符号的优先判断,定义两个字符串数组optr[]、opnd[]用来模拟栈,存放算术符和操作数,用a[]来存放表达式字符串,在分析时还要通过函数int?f(char?c)和int?g(char?c),判断运算符之间的优先关系,根据不同情况作各种不同操作。流程图如下:

 输入算数表达式,以#结束

 输入算数表达式,以#结束

 初始化loptr[1]=’#’

 用get()取一个待分析字符s

 Optr[1]和s是否同时为#

 判断S是否为运算量

 Floptrj]<g(s)

 Floptr[j]=g(s)

 Floptr[j]>g(s)

 其他情况error()

 当前字符栈optr

 栈顶元素出栈

 结束

 存入opnd[]

 get()

 2,实验程序源代码:

 #include<stdio.h>

 char a[21],optr[10],op,s;

 int opnd[10],i,j,k,x1,x2,x3;

 int operand(char s)

 {if((s>=48)&&(s<=57)) return 1;

 else return 0;

 }

 int f(char s)

 {switch(s){

  case '+':return 4;break;

  case '*':return 6;break;

  case 'i':return 6;break;

  case '(':return 2;break;

  case ')':return 6;break;

  default:return 0;}

 }

 int g(char s)

 {switch(s){

  case '+':return 3;break;

  case '*':return 5;break;

  case 'i':return 7;break;

  case '(':return 7;break;

  case ')':return 2;break;

  default:return 0;}

 }

 void get()

 {s=a[i];

 i++;}

 void main()

 {printf("请输入表达式(以‘#’结束):\n");

 i=0;

 do{i++;

  scanf("%c",&a[i]);

 }while(a[i]!='#');

 i=j=k=1;

 optr[j]='#';

 get();

 while(!((optr[j]=='#')&&(s=='#')))

 {if(operand(s)) {opnd[k]=s-48;k++;get();}

 else if (f(optr[j])<g(s)) {j++;optr[j]=s;get();}

  else if (f(optr[j])>g(s))

  {op=optr[j];

  j--;

  x1=opnd[k-1];

  x2=opnd[k-2];

  k=k-2;

  switch(op)

  {case '+':x3=x1+x2;break;

  case '*':x3=x1*x2;break;

  default:break;

  }

  opnd[k]=x3;

  k++;

  printf("(%c,%d,%d,%d)\n",op,x2,x1,x3);

  }

  else {j--;get();}

 }

 }

 3实验结果:

 心得体会:

 通过本次实验,我更加深刻的学习到了很多:

 1、通过实验我对词法分析和语法分析原理有了更深刻的理解。

 2、而且对词法分析和语法分析在实践中的应用有了深入的掌握。

 3、更加熟悉了构造词法分析程序和语法分析程序的手工方式的相关原理,能够实现对词法分析程序所提供的单词符号序列进行相应的语法检查和结构分析,达到了学以致用的目的。

 售后服务方案(赠送)

 1.售后服务概述

  公司长期以来一直致力于提供高质量、完善的支持服务,确保用户的系统稳定运行。

  公司拥有一批资深的施工人员,具有丰富的经验,能够很好的解决设备各类故障,强大的用户支持队伍和良好的用户满意度是我们的一大优势。

  维护计划及承诺  

 ?一、 项目售后服务内容承诺  

  我公司贯彻执行:“诚信正直、成就客户、完善自我、追求卓越”的宗旨,对于已经竣工、验收合格的项目进行质量跟踪服务,本着技术精益求精的精神,向用户奉献一流的技术和一流的维护服务。

 我公司如果承接了端拾器项目,将严格遵循标书及合同的规定,在保证期内向业主提供该项目的责任和义务。在保修期之后,考虑到设备维护的连续性,建议业主与我公司签订维护合同,以确保此系统项目的正常运行所必需的技术支持和管理支持。

 二、 服务与保证期  

 ?在项目验收合格之日起,开始进行售后服务工作,包括以下几个方面:

  1、售后服务期; ?2、维护人员; 3、售后服务项目; 4、服务响应时间。

 ? 三、 售后服务期  

 ? 在项目验收合格之日起,即进入了售后服务期。

 售后服务期=质量保证期+质量维护期

 ? 质量保证期:在质量保证期内,如因质量问题造成的故障,实行免费更换设备、元器件及材料。如因非质量因素造成的故障,收取更换设备、元器件及材料成本费。

 质量维护期:在质量保证期之后,即自行进入质量维护期。

 我方对所承担端拾器项目提供终身质量维护服务,以不高于本合同设备单价的优惠价格提供所需更换的元器件及材料,另收维护人员工本费。

   四、 具体措施承诺  

 ? 1、首先在签订项目合同的同时与客户签订售后服务保证协议书,排除客户的后顾之忧,对客户做出实事求是的、客观的承诺。

 2、对已经验收合格交付用户的端拾器项目,在合同期内与用户进行联系,记录用户使用情况,系统运行状况等进行质量跟踪调查,变被动服务为主动服务。

 3、对已交工的端拾器项目建立系统运行档案,并进行质量跟踪。

 4、系统运行档案记录其端拾器项目运行情况、各类设备使用情况、操作人员操作水平情况及人员流动情况。

 5、针对各用户单位操作人员出现的代表性问题,定期对操作人员进行技术培训或到现场培训及指导。

 6、正在使用中的系统、设备出现故障时,公司维修服务人员接到报告后及时赴现场处理、维修。

 7、对于运行时间较长的端拾器项目,公司维修服务人员定期与客户进行联系询问情况,定期到客户方进行巡视、检查,并做出记录,记录归档保存。

 8、施工保证

 将选派具有丰富经验的技术人员负责端拾器项目具体施工,保证安装质量及系统使用功能,并保证整个系统运行平稳、高效、可靠。

 9、系统保修

 作为项目承包单位,我公司将严格遵循招标文件及合同的规定,向业主提供端拾器项目最终验收合格之日起,在保质期范围内免费维修。

 10、保修期内设备损坏,经鉴定为设备本身原因造成的故障,我方负责免费维修或者更换;同时负责在保修期内定期对设备提供保养维护服务。

 总之,为使业主使用放心、使用方便、保证端拾器项目正常运行,公司全体技术、维护人员本着客户第一的原则,全心全意地为客户着想,全力以赴的进行工作,让我们共同携手,为创造美好的明天而努力工作。

  五、保修服务内容及范围

  我公司将为所承担的各个端拾器项目提供保修服务,有效期从项目验收后,业主在竣工报告上签字之日起。

 1、 响应时间:具体的响应时间将按故障级别划分;

 2、 维修地点:用户现场。

 我公司负责实施的所有系统项目,在正常环境下做适当使用时所发生的故障,我公司将提供约定保修服务。非当前故障,我公司安排提供服务,但需按收费标准另收费用。

 我公司的保修服务仅限于经我公司认定的合格产品。所谓不合格的产品包括:非经我公司供应的产品、非经我公司认定合格的产品及顾客不允许我公司做功能改进的产品。

  下列情况所发生的系统损害不包括在保修服务范围内:

 1、 使用不适当的工具进行系统维护时造成的系统设备损坏;

 2、 现场环境不符合我公司建议的规范;

 3、 意外、自然灾害、疏忽及不当使用、战争、暴动、罢工、雷击或电力故障、顾客搬运不当的损坏,经由非我公司人员或其授权的子承包商对系统进行修改和变动;

 4.设备的维护和信息处理方式。

  六、 系统维护

  1、系统运行管理工作

 为了保证系统能够长时间的正常运行,我们将进行完善的系统培训,同时制定各个系统项目操作规程,并配合业主制定操作人员责任界面及合理的交接班制度。

 2、系统维护保养

 我公司的售后服务人员在维护期内将对贵方的系统项目提供服务,使它们保持良好的运行状态。

 ? 3、月度保养

 ?  坚持月度维护保养,保证每个系统项目机械装置保持最佳工作状态。

  七、维护及服务支持措施

 1、电话支持服务

 电话服务热线号码以我方提供给业主的号码为准(包括电话和传真号码)。如有更改,我方至少在自更改之日起3天内以电子邮件、传真、电话的方式通知业主。

 2、现场排除故障或技术指导

 我方在接到业主的电话支持服务请求后,如果不能通过电话支持服务解决设备或产品发生的技术故障,且经双方商议确认需要进行现场支持的情况下,我方将派专业项目技术人员及时前往现场协助业主排除故障。

  3、电话咨询服务

 对业主在使用设备或产品过程中产生的非故障类问题,我方提供电话咨询服务。

 4、投诉受理服务

  我方在公司设有用户投诉电话

推荐访问:分析器 词法 编译 语法 原理