Cminus语言词法分析器实验报告.docx

上传人:b****5 文档编号:11884770 上传时间:2023-04-08 格式:DOCX 页数:11 大小:20.53KB
下载 相关 举报
Cminus语言词法分析器实验报告.docx_第1页
第1页 / 共11页
Cminus语言词法分析器实验报告.docx_第2页
第2页 / 共11页
Cminus语言词法分析器实验报告.docx_第3页
第3页 / 共11页
Cminus语言词法分析器实验报告.docx_第4页
第4页 / 共11页
Cminus语言词法分析器实验报告.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

Cminus语言词法分析器实验报告.docx

《Cminus语言词法分析器实验报告.docx》由会员分享,可在线阅读,更多相关《Cminus语言词法分析器实验报告.docx(11页珍藏版)》请在冰豆网上搜索。

Cminus语言词法分析器实验报告.docx

Cminus语言词法分析器实验报告

【C-minus语言词法分析器实验报告】

精品文档

装订线

线

编译原理试验报告

题目:

C_minus语言词法分析器

学院计算机科学与技术

专业xxxxxxxxxxxxxxxx

学号xxxxxxxxxxxx

姓名xxxx

指导教师xxxx

20xx年xx月xx日

C_minus语言词法分析器

一、试验目的?

?

1.理解词法分析器的设计方法:

利用DFA编写相应的程序。

?

2.把握手工编写词法分析程序的方法。

3.复习熟识以前学过的编程语言?

?

4.通过试验了解编译器词法分析的工作原理?

?

二、试验原理?

?

1.文法的概念,DFA的表示方法。

?

2.词法分析程序的输出和输入:

词法分析程序的功能是读入源程序,输出单词符号。

单词符号是程序设计语言的比本语法符号,程序设计语言的单词符号一般分为如下几种:

关键字,标示符,常数,运算符,界符,单词的输出是二元式的形式,需要知道二元式的表示方法,把得到的二元式写入输出文件。

转化图如下:

?

?

源程序

源程序?

词法分析程序?

记号文件?

?

3.熟识单词的描述工具,如正规文法,正规式,以及知道正规文法和正规式的等价性以及他们之间的相互转化。

熟识把正规文法转化为正规式,把正规式转化为NFA以及把NFA转为相应的DFA,最终再把DFA简化,DFA的状态转化为相应的子程序,最终得到词法分析器

4.C语言的基本语法。

?

三、试验要求?

?

1、该个词法分析器要求至少能够识别以下几类单词:

?

关键字:

else?

if?

int?

return?

void?

while共6个,全部的关键字都是保存字,并且必需是小写;?

标识符:

识别与C语言词法规定相一致的标识符,通过以下正则表达式定义:

ID?

=?

letter?

(letter?

|?

digit)*;?

常数:

NUM?

=?

digit?

digit*(.digit?

digit*?

|ε)(e(+?

|?

-?

|ε)?

digit?

digit*?

|ε),letter?

=?

a|..|z|A|..|Z|,digit?

=?

0|..|9,包括整数,如123等;小数,如123.45等;科学计数法表示的常数,如1.23e3,2.3e-9等;?

专用符号:

+?

-?

*?

/?

?

=?

?

=?

==?

!

=?

=,?

(?

)?

[?

]?

{?

}?

/*?

*/;?

2、分析器的输入为由上述几类单词构成的程序,输出为该段程序的机内表示形式,即关键字、运算符、界限符变为其对应的机内符,常数使用二进制形式,标识符使用相应的标识符表指针表示。

?

3、词法分析器应当能够指出源程序中的词法错误,如不行识别的符号、错误的词法等。

四、试验结果〔程序〕及分析

0?

typedef?

struct?

{?

?

char?

name[30];

int?

code;?

?

int?

addr;?

}token;//存储刚从文件中读取的字符

typedef?

struct{

char?

name[30];?

?

int?

code;?

}Keyword;?

typedef?

struct?

{?

?

char?

name[30];?

?

int?

code;?

?

int?

addr;

}symbol;?

Keyword?

key[6]={{else,1},{if,2},{int,3},{return,4},{void,5},{where,6}};?

char?

ch;//接受字符?

FILE?

*source;//源文件?

FILE?

*keytxt;//关键字输出文件?

FILE?

*badgetxt;//标识符输出文件?

FILE?

*othertxt;//其他单词输出文件?

FILE?

*number;?

int?

error_count;//错误的个数?

int?

addr_count;//标识符表的指针?

int?

lineof;//行号?

token?

current;//临时存放读入的字符?

token?

zancun;

symbol?

currentsymbol;?

symbol?

symboltable[N];//标识符表

void?

error(int?

i);?

void?

main()?

{?

void?

scan();

error_count=0;?

?

addr_count=0;

error_count=0;?

?

lineof=0;?

?

scan();

}?

void?

scan()?

{

int?

i=0;?

void?

iskeyword();//推断关键字

void?

isOthers()?

//推断其他单词?

void?

output_1();//关键字输出文件

void?

output_2();//标识符输出文件?

void?

output_others();//其他单词输出文件

void?

Iszhushi();

?

void?

isnumber();?

?

if((source=fopen(Source.txt,r))==NULL){//打开源文件

printf(file?

open?

error/n);

?

exit(0);

}

if((keytxt=fopen(key.txt,w))==NULL){//打开关键字文件

printf(file?

open?

error/n);

?

exit(0);?

?

}?

if((badgetxt=fopen(badge.txt,w))==NULL){//打开标识符文件

?

printf(file?

open?

error/n);

?

exit(0);?

?

}?

if((othertxt=fopen(others.txt,w))==NULL)?

{

?

printf(file?

open?

error\n);

?

exit(0);

}

if((number=fopen(number.txt,w))==NULL)?

{?

printf(file?

open?

error\n);

exit(0);

}?

ch=fgetc(source);

while(ch!

=EOF)?

{

?

?

for(i=0;i30;i++)

current.name[i]=\0;

?

if((ch=a?

?

ch=z)?

||(ch=A?

?

ch=Z)?

||?

ch==_?

?

iskeyword();

if(ch==\\)?

?

?

Iszhushi();?

?

if(ch=0?

ch=9)?

isnumber();

else

?

isOthers();?

?

ch=fgetc(source);

}?

?

fclose(source);

fclose(keytxt);

?

?

fclose(badgetxt);

?

?

fclose(othertxt);

fclose(number);?

}?

void?

iskeyword(){

int?

i=0,k=0,j=0;

int?

h=0;?

?

while(((ch=a)?

?

(ch=z))?

||((ch=A)?

?

(ch=Z))?

||?

ch==_?

||?

(ch0?

?

ch9))?

{?

current.name[i]=ch;

?

i++;?

ch=fgetc(source);?

}

zancun=current;

for(i=0;i6;i++)?

{?

for(j=0;j30;j++){?

if(current.name[j]==key[i].name[j]){

h=0;

}?

else{?

?

h=1;

?

break;

}

?

}?

?

if(h==0)?

break;

?

}

?

if(h==0){

current.code=key[i].code;

output_1();?

}?

else{?

strcpy(symboltable[addr_count].name,current.name);

symboltable[addr_count].code=10;

?

symboltable[addr_count].addr=addr_count;

addr_count++;

output_2();?

}

?

}?

void?

isOthers(){

char?

ch1;

int?

i;?

?

for(i=0;i30;i++)

current.name[i]=\0;?

?

switch(ch){?

?

case?

+:

{?

current.name[0]=+;

?

?

current.code=13;

?

?

current.addr=-1;

?

?

output_others();

break;

?

?

}

case?

-:

?

{

current.name[0]=-;

?

?

current.code=14;

?

current.addr=-1;?

?

output_others();

break;

}?

?

case?

*:

?

{?

?

current.name[0]=*;?

?

current.code=15;?

?

current.addr=-1;

output_others();?

?

break;

?

}?

?

case?

/:

{

?

current.name[0]=/;?

?

current.code=16;?

?

current.addr=-1;

?

output_others();?

?

break;?

?

}?

?

case:

{?

ch1=fgetc(source);

if(ch1===){

current.name[0]=;

current.name[1]==;?

current.code=17;?

?

output_others();

?

break;

?

}?

else{?

fseek(source,-1,1);?

current.name[0]=;

current.code=18;?

?

?

current.addr=-1;

?

output_others();?

break;?

?

}?

}

?

?

case:

?

{

ch1=fgetc(source);

?

if(ch1===){?

current.name[0]=;?

current.name[1]==;

?

current.code=19;

?

output_others();

?

break;

}else{

?

fseek(source,-1,1);?

?

current.name[0]=;

?

current.code=20;?

output_others();

?

break;

?

?

}

}?

case=:

?

{

ch1=fgetc(source);?

if(ch1===){

current.name[0]==;

current.name[1]==;

current.code=21;

current.addr=-1;

output_others();

break;

}else?

{

current.name[0]==;?

current.code=22;?

current.addr=-1;?

output_others();?

fseek(source,-1,1);

break;

}

}

case?

!

:

?

{

ch1=fgetc(source);?

if(ch1===){

current.name[0]=!

;

current.name[1]==;

current.code=23;

current.addr=-1;

output_others();

break;

}else{

fseek(source,-1,1);?

?

current.name[0]=!

;

?

current.code=24;?

current.addr=-1;

output_others();

break;

}

}

case?

;:

?

{?

current.name[0]=;;?

current.code=25;

current.addr=-1;

?

output_others();

?

break;

}?

case?

:

?

{?

current.name[0]=,;?

current.code=26;

current.addr=-1;

output_others();

?

}

?

case?

(:

?

{

int?

i=ftell(source);

char?

ch1=ch;

char?

ch2;

while(ch!

=)){

ch=fgetc(source);?

?

}

if(ch==))?

{

current.name[0]=ch1;

current.name[1]=ch;?

current.code=27;

current.addr=-1;

output_others();?

fseek(source,i,0);?

ch2=fgetc(source);?

ch2=fgetc(source);

break;

}else{

?

error_count++;

error

(1);?

fseek(source,i,0);?

ch2=fgetc(source);

ch2=fgetc(source);?

break;

}

?

}

case?

{:

{?

current.name[0]={;?

?

current.code=28;

?

current.addr=-1;?

output_others();

?

break;

}

case?

}:

{?

current.name[0]=};

?

current.code=28;

?

current.addr=-1;

?

output_others();

break;

}

case?

[:

{?

?

current.name[0]=[;

?

current.code=29;?

current.addr=-1;

output_others();

break;?

}

case?

]:

?

{?

?

current.name[0]=];

current.code=29;

current.addr=-1;

?

output_others();

?

break;

}

case10:

?

{

?

lineof++;?

break;

?

}

}?

}?

void?

Iszhushi()?

{

char?

ch1;

ch1=ch;

ch=fgetc(source);

if(ch==*)?

{

for(;;){?

ch=fgetc(source);?

?

if(ch==EOF)?

{?

?

error

(2);

break;

}?

if(ch==*)?

{

ch1=ch;

ch=fgetc(source);

if(ch==\\)?

{

?

ch=fgetc(source);?

break;?

?

}

}

}

}else{

error_count++;

?

error

(2);

}?

}?

void?

isnumber()?

{

int?

k=0;

void?

output_number();?

?

while(ch=0?

ch=9){

?

current.name[k++]=ch;

ch=fgetc(source);

}

current.code=11;?

output_number();?

}?

void?

output_1()?

{

printf(关键字:

%s,%d,current.name,current.code);

putchar(10);

fprintf(keytxt,%s,%d,current.name,current.code);?

}?

void?

output_2()?

{?

?

printf(标识符地址:

%s,%d,current.name,addr_count);

putchar(10);?

fprintf(badgetxt,%s,%d,current.name,addr_count);?

}?

void?

output_others()?

{?

?

printf(其它单词:

%s,%d,current.name,current.code);?

?

putchar(10);fprintf(othertxt,%s,%d,current.name,current.code);

}?

void?

error(int?

i)?

{

switch(i){

case?

1:

printf(界符发生错误,发生在第%d行/n,lineof);

case?

2:

printf(注释发生错误,发生在第%d行/n,lineof);

}?

}?

void?

output_number()?

{?

printf(常数%s,%d\n,current.name,current.code);

fprintf(number,%s,%d,current.name,current.code);

?

}?

试验结果分析,程序运行结果截图:

关键字输出文件:

?

标识符输出文件:

?

数字的输出文件?

其它单词输出文件:

?

售后服务方案(赠送)

1.售后服务概述

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

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

维护打算及承诺 

?

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

我公司贯彻执行:

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

我公司假如承接了端拾器项目,将严格遵循标书及合同的规定,在保证期内向业主提供该项目的责任和义务。

在保修期之后,考虑到设备维护的连续性,建议业主与我公司签订维护合同,以确保此系统项目的正常运行所必需的技术支持和管理支持。

二、服务与保证期 

?

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

1、售后服务期; ?

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

?

三、售后服务期 

?

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

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

?

质量保证期:

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

如因非质量因素造成的故障,收取更换设备、元器件及材料本钱费。

质量维护期:

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

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

四、具体措施承诺 

?

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

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

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

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

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

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

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

8、施工保证

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

9、系统保修

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

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

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

五、保修服务内容及范围

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

1、响应时间:

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

2、修理地点:

用户现场。

我公司负责实施的全部系统项目,在正常环境下做适当使用时所发生的故障,我公司将提供商定保修服务。

非当前故障,我公司支配提供服务,但需按收费标准另收费用。

我公司的保修服务仅限于经我公司认定的合格产品。

所谓不合格的产品包括:

非经我公司供应的产品、非经我公司认定合格的产品及顾客不同意我公司做功能改良的产品。

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

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

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

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

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

六、系统维护

1、系统运行管理工作

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

2、系统

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1