[编译原理-词法分析器-实验报告] 词法分析器c语言

  精品文档

 词法分析器实验报告

 实验目的:

 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。

 功能描述:

 该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error!”,然后跳过错误部分继续进行)

 设计思想

 设计该词法分析器的过程中虽然没有实际将所有的状态转移表建立出来,但是所用的思想是根据状态转移表实现对单词的识别。首先构造一个保留字表,然后,每输入一个字符就检测应该进入什么状态,并将该字符连接到d串后继续输入,如此循环,最后根据所在的接受状态以及保留字表识别单词。

 符号表:

 记号

 类别

 属性值

 ws

 -

 -

 const

 保留字

 1

 var

 保留字

 1

 call

 保留字

 1

 begin

 保留字

 1

 if

 保留字

 1

 while

 保留字

 1

 do

 保留字

 1

 odd

 保留字

 1

 end

 保留字

 1

 then

 保留字

 1

 procedure

 保留字

 1

 =

 运算符

 2

 <

 运算符

 2

 <=

 运算符

 2

 <>

 运算符

 2

 >

 运算符

 2

 >=

 运算符

 2

 *

 运算符

 2

 +

 运算符

 2

 -

 运算符

 2

 /

 运算符

 2

 :=

 运算符

 2

 ident

 标识符

 3

 number

 常数

 4

 (

 分隔符

 5

 )

 分隔符

 5

 ;

 分隔符

 5

 ,

 分隔符

 5

 .

 分隔符

 5

 状态转换图:

 ①标识符及保留字:

 Start

 Start

 letter

 letter or digitt

 ②number:

 7

 7

 0

 2

 1

 4

 3

 6

 5

 start

 other

 digit

 .

 digit

 E

 + | -

 digit

 digit

 digit

 digit

 E

 digit

 *

 other

 other

 ③关系操作符:

 start

 start

 <

 other

 =

 

  (<=, 2)

 >

 =

 other

 >

 =

 *

 *

  (<>, 2)

  (<,2)

  (=, 2)

  (>=, 2)

 (>, 2)

 :

 =

 (:=,2)

 ④分隔符:

 start;

 start

 ;

 (

 )

 ,

 .

 ( ; ,5)

 ( (,5)

 ( ),5)

 ( , ,5)

 ( . ,5)

 ⑤算术运算符:

 start

 start

 +

 -

 *

 /

 ( + ,2)

 ( -,2)

 ( *,2)

 ( / ,2)

 使用环境:

 Windows xp下的visual c++6.0

 程序测试:

 input1 :

 int a,b;

 a=b+2;

 input2:

 while(a>=0)

 do

 7x=x+6.7E+23;

 end;

 input3:

 begin:

 x:=9

 if x>0 then x:=x+1;

 while a:=0 do

 b:=2*x/3,c:=a;

 end;

 output1:

 3,int

 3,a

 5,,

 3,b

 5,;

 3,a

 2,=

 3,b

 2,+

 4,2

 5,;

 output2:

 1,while

 5,(

 3,a

 2,>=

 4,0

 5,)

 1,do

 error line 3

 2,=

 3,x

 2,+

 4,6.7E+23

 5,;

 1,end

 5,;

 output3:

 1,begin

 error line 1

 3,x

 2,:=

 4,9

 1,if

 3,x

 2,>

 4,0

 1,then

 3,x

 2,:=

 3,x

 2,+

 4,1

 5,;

 1,while

 3,a

 2,:=

 4,0

 1,do

 3,b

 2,:=

 4,2

 2,*

 3,x

 2,/

 4,3

 5,,

 3,c

 2,:=

 3,a

 5,;

 1,end

 5,;

 测试结果与预期结果一致

 源程序代码:

 #include<stdio.h>

 #include<string.h>

 void main()

 {

  int i=0,j,k=0,state=1,f=0,linenum=1;

  char a[11][10]={"const","var","call","begin","if","while","do","odd","end","then","procedure"};

  char b,d[40]={"\0"};

  freopen("input.txt","r",stdin);

  freopen("output.txt","w",stdout);

  b=getchar();

  while(b!=EOF)/*判断所输入字符是否为结束符*/

  {

  if(b==' '||b=='\n'||b=='\t')/*滤过空格、换行等分隔符号*/

  { if(b='\n') linenum++;

  b=getchar();

  }

  else if((b>='a'&&b<='z')||(b>='A'&&b<='Z'))/*识别标识符以及保留字*/

  {

  d[i++]=b;

  b=getchar();

  while((b>='a'&&b<='z')||(b>='A'&&b<='Z')||(b>='0'&&b<='9'))

  {

  d[i++]=b;

  b=getchar();

  }

  for(j=0;j<11;j++)/*查询保留字表确定该单词是否是保留字*/

  { if(strcmp(d,a[j])==0)

  { printf("1,%s\n",d);

  k=1;

  break;

  }

  }

  if(k==0)/*在保留字表中没有查到该单词,是标识符*/

  printf("3,%s\n",d);

  for(j=0;j<=i;j++)

  d[j]='\0';

  i=0;

  k=0;

  }

  else if(b>='0'&&b<='9')/*识别常数*/

  { d[i++]=b;

  b=getchar();

  while(f!=1){

  switch (state) {

  case 1:

  if(b>='0'&&b<='9') {

  state=1;

  d[i++]=b;

  b=getchar();}

  else if(b=='.') { state=2;d[i++]=b;b=getchar();}

  else if(b=='E') { state=4;d[i++]=b;b=getchar();}

  else state=7;

  break;

  case 2:

  if(b>='0'&&b<='9') {

  state=3;

  d[i++]=b;

  b=getchar();}

  else state=8;

  break;

  case 3:

  if(b>='0'&&b<='9') {

  state=3;

  d[i++]=b;

  b=getchar();}

  else if(b=='E') { state=4;d[i++]=b;b=getchar();}

  else state=7;

  break;

  case 4:

  if(b=='+'||b=='-') { state=5;d[i++]=b;b=getchar();}

  else if(b>='0'&&b<='9'){ state=6;d[i++]=b;b=getchar();}

  else state=8;

  break;

  case 5:

  if(b>='0'&&b<='9'){ state=6;d[i++]=b;b=getchar();}

  else state=8;

  break;

  case 6:

  if(b>='0'&&b<='9'){ state=6;d[i++]=b;b=getchar();}

  else state=7;

  break;

  case 7: f=1;break;

  case 8: f=1;break;

  }

  }

  if(state==7&&(b<'a'||b>'z')&&(b<'A'||b>'Z'))

  printf("4,%s\n",d);

  else if(state==7&&(b>='a'&&b<='z')||(b>='A'&&b<='Z'))/*数字后接字母的出错控制*/

  {

  while((b>='a'&&b<='z')||(b>='A'&&b<='Z'))

  { d[i++]=b;

  b=getchar();

  }

  printf("error line %d\n",linenum);

  }

  else printf("error line %d\n",linenum);

  for(j=0;j<=i;j++)

  d[j]='\0';

  i=0;

  f=0;

  state=1;

  }

  else if(b=='<')/*识别'<'、'<='和'<>'*/

  { d[i++]=b;

  b=getchar();

  if(b=='='||b=='>')

  { d[i++]=b;

  b=getchar();

  printf("2,%s\n",d);

  for(j=0;j<=i;j++)

  d[j]='\0';

  i=0;

  }

  else

  { printf("2,%s\n",d);

  for(j=0;j<=i;j++)

  d[j]='\0';

  i=0;

  }

  }

  else if(b=='>')/*识别'>'和'>='*/

  { d[i++]=b;

  b=getchar();

  if(b=='=')

  { d[i++]=b;

  b=getchar();

  printf("2,%s\n",d);

  for(j=0;j<=i;j++)

  d[j]='\0';

  i=0;

  }

  else

  { printf("2,%s\n",d);

  for(j=0;j<=i;j++)

  d[j]='\0';

  i=0;

  }

  }

  else if(b==':')/*识别':='*/

  { d[i++]=b;

  b=getchar();

  if(b=='=')

  { d[i++]=b;

  b=getchar();

  printf("2,%s\n",d);

  }

  else printf("error line %d\n",linenum);

  for(j=0;j<=i;j++)

  d[j]='\0';

  i=0;

  }

  else if(b=='*'||b=='+'||b=='-'||b=='/'||b=='=')/*识别运算符*/

  { printf("2,%c\n",b);

  b=getchar();

  }

  else if(b=='('||b==')'||b==','||b==';'||b=='.')/*识别分隔符*/

  { printf("5,%c\n",b);

  b=getchar();

  }

  else

  { printf("error line %d\n",linenum);

  b=getchar();

  }

  }

 }

 实验心得:

  此次实验让我了解了如何设计、编制并调试词法分析程序,并加深了我对词法分析器原理的理解;熟悉了直接构造词法分析器的方法和相关原理,并学会使用c语言直接编写词法分析器;同时更熟练的掌握用c语言编写程序,实现一定的实际功能。

 售后服务方案(赠送)

 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、投诉受理服务

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

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