编译原理词法分析实验一词法分析扫描器的设计实现.docx

上传人:b****6 文档编号:6176161 上传时间:2023-01-04 格式:DOCX 页数:19 大小:88.26KB
下载 相关 举报
编译原理词法分析实验一词法分析扫描器的设计实现.docx_第1页
第1页 / 共19页
编译原理词法分析实验一词法分析扫描器的设计实现.docx_第2页
第2页 / 共19页
编译原理词法分析实验一词法分析扫描器的设计实现.docx_第3页
第3页 / 共19页
编译原理词法分析实验一词法分析扫描器的设计实现.docx_第4页
第4页 / 共19页
编译原理词法分析实验一词法分析扫描器的设计实现.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

编译原理词法分析实验一词法分析扫描器的设计实现.docx

《编译原理词法分析实验一词法分析扫描器的设计实现.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析实验一词法分析扫描器的设计实现.docx(19页珍藏版)》请在冰豆网上搜索。

编译原理词法分析实验一词法分析扫描器的设计实现.docx

编译原理词法分析实验一词法分析扫描器的设计实现

编译原理程序设计实验报告

——实验题目

班级:

计算机1306姓名:

学号:

289

实验目标:

词法分析扫描器的设计实现

实验内容:

1.概要设计

1)主函数:

每次从文件中读取一个字符,不是#,继续判断其是否是0~9数字,是进入isnumber()函数,否继续判断其是否是a~z或A~Z,是进入isalpha()函数,否继续判断是否是空格或换行符,是继续读下一个字符,否进入isother()函数。

2)Isnumber():

读字符,将数字(包括小数点)全部接收,并存入常数表。

3)Isalpha():

读字符,将a~z或A~Z(包括下划线)全部接收,与关键字表比较,匹配,输出序号,否则存入标识符表。

4)Isother():

读字符,将符号都接受,与界符表比较,匹配输出序号,遇到”或’分别存入字符表和字符串表。

2.流程图

T

F

T

F

T

F

F

3.关键函数

voidIsNumber();//读的是数字

voidIsAlpha();//读的是关键字和标示符

intIsOther();//读字符、字符串、界符

源程序代码:

(加入注释)

#include

#include

#include

#include

usingnamespacestd;

/***********定义结构体***********/

typedefstructToken

{

charname[20];

intstate;//状态,为0是标识符,为1是字符,为2是字符串,为3是数字,为4是关键字,为5是界符

}Token;

typedefstructSTR//

{

charname[20];

intcode;

}STR;

STRiT[10];

STRcT[20];

STRsT[20];

STRCT[20];

STRKT[10]={{"int",4},{"main",5},{"void",6},{"if",7},{"else",8},{"char",9}};

STRPT[30]={{">=",10},{"<=",11},{"==",12},{"=",13},{">",14},{"<",15},{"+",16},{"-",17},{"*",18},{"/",19},

{"{",20},{"}",21},{",",22},{";",23},{"(",24},{")",25},

{"[",26},{"]",27}};

/***********全局变量声明*********/

TokenCurrentToken;//正在读的token

Tokentoken[200];

FILE*fp;//源文件指针

charch;//读取字符

intstate=0;//0表示标识符,1表示字符,2表示字符串

intiT_i=0;//iT结构体数组下标

intcT_i=0;

intsT_i=0;

intCT_i=0;

intindex=0;//token的下标

/***函数声明***/

voidIsNumber();//读的是数字

voidIsAlpha();//读的是字母,关键字和标示符

intIsOther();//,;+-

/******************主函数**********************/

intmain()

{

inti=0;

if((fp=fopen("source.txt","r"))==NULL)

{

cout<<"cannotopenthesourcefile!

\n"<

exit

(1);

}

ch=fgetc(fp);//文件中读一个字符

while(ch!

='#')

{

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

CurrentToken.name[i]='\0';//将单词缓冲区初始化

if((ch>='0')&&(ch<='9'))//数字

IsNumber();

elseif(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))||(ch=='_'))//关键字和标识符

{

IsAlpha();

}

elseif(ch==''||ch=='\n')

{

ch=fgetc(fp);

}

else

IsOther();

}

cout<

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

{

cout<

}

cout<

cout<<"finish"<

return0;

}

/************数字处理****************/

voidIsNumber()

{

intk=0;

while(((ch>='0')&&(ch<='9')))

{

CurrentToken.name[k++]=ch;//将数字放入单词缓冲区

ch=fgetc(fp);

}

boolflag=1;

if(ch=='.')

{

CurrentToken.name[k++]=ch;

ch=fgetc(fp);

if(((ch<'0')||(ch>'9')))

{

CurrentToken.name[k++]=ch;

flag=0;

}

else

{

while(((ch>='0')&&(ch<='9')))

{

CurrentToken.name[k++]=ch;//将数字放入单词缓冲区

ch=fgetc(fp);

}

}

}

if(flag==1)

{

strcpy(CT[CT_i++].name,CurrentToken.name);

strcpy(token[index].name,CurrentToken.name);

token[index++].state=3;

//cout<"<

cout<<"<03>";

}

else

cout<"<

}

/************是否为关键字****************/

voidIsAlpha()

{

inti=0;

if(state==0)

{

boolflag=0;

while(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))||ch=='_')//将完整的单词放入单词缓冲区

{

CurrentToken.name[i++]=ch;

ch=fgetc(fp);

}

flag=0;//判断是否是关键字

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

{

if(strcmp(CurrentToken.name,KT[i].name)==0)

{

flag=1;

//printf("%s<%02d>\n",CurrentToken.name,KT[i].code);

strcpy(token[index].name,CurrentToken.name);

token[index++].state=4;

printf("<%02d>",KT[i].code);

break;

}

}

if(flag!

=1)

{

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

{

CurrentToken.name[i++]=ch;

ch=fgetc(fp);

}

//printf("%s<00>\n",CurrentToken.name);

printf("<00>");

strcpy(token[index].name,CurrentToken.name);

token[index++].state=0;

inttag=0;

for(intj=0;j

{

if(strcmp(CurrentToken.name,iT[j].name)==0)

{

tag=1;

break;

}

}

if(tag==0)

{

strcpy(iT[iT_i].name,CurrentToken.name);

iT[iT_i++].code=0;

}

 

}

}

}

/***************其它************/

intIsOther()

{

inti;

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

{

CurrentToken.name[i]='\0';//将缓冲区初始化

}

boolflag=0;

switch(ch)

{

case'>':

{

CurrentToken.name[0]='>';

flag=1;

ch=fgetc(fp);

if(ch=='=')

{

CurrentToken.name[1]='=';

ch=fgetc(fp);

break;

}

else

{

break;

}

}

case'<':

{

CurrentToken.name[0]='<';

flag=1;

ch=fgetc(fp);

if(ch=='=')

{

CurrentToken.name[1]='=';

ch=fgetc(fp);

break;

}

else

{

break;

}

}

case'=':

{

CurrentToken.name[0]='=';

flag=1;

ch=fgetc(fp);

if(ch=='=')

{

CurrentToken.name[1]='=';

ch=fgetc(fp);

break;

}

else

{

break;

}

}

case'+':

{

CurrentToken.name[0]='+';

break;

}

case'-':

{

CurrentToken.name[0]='-';

break;

}

case'*':

{

CurrentToken.name[0]='*';

break;

}

case'/':

{

CurrentToken.name[0]='/';

break;

}

case'{':

{

CurrentToken.name[0]='{';

break;

}

case'}':

{

CurrentToken.name[0]='}';

break;

}

case',':

{

CurrentToken.name[0]=',';

break;

}

case';':

{

CurrentToken.name[0]=';';

break;

}

case'(':

{

CurrentToken.name[0]='(';

break;

}

case')':

{

CurrentToken.name[0]=')';

break;

}

case'[':

{

CurrentToken.name[0]='[';

break;

}

case']':

{

CurrentToken.name[0]=']';

break;

}

case'\'':

{

CurrentToken.name[0]='\'';

ch=fgetc(fp);

if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))

{

CurrentToken.name[1]=ch;

ch=fgetc(fp);

if(ch=='\'')

{

CurrentToken.name[2]='\'';

cout<<"<01>";

strcpy(token[index].name,CurrentToken.name);

token[index++].state=1;

inttag=0;

for(intj=0;j<=cT_i;j++)

{

if(strcmp(cT[cT_i].name,CurrentToken.name)==0)

tag=1;

}

if(tag==0)

{

strcpy(cT[cT_i++].name,CurrentToken.name);

}

 

ch=fgetc(fp);

return0;

}

else

{

cout<<"error1";

exit

(1);

}

}

else

{

cout<<"error2";

exit

(1);

}

}

case'\"':

{

intj=1;

CurrentToken.name[0]='\"';

ch=fgetc(fp);

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

{

CurrentToken.name[j++]=ch;

ch=fgetc(fp);

}

if(ch=='\"')

{

CurrentToken.name[j++]='\"';

cout<<"<02>";

strcpy(token[index].name,CurrentToken.name);

token[index++].state=1;

inttag=0;

for(intj=0;j<=sT_i;j++)

{

if(strcmp(sT[sT_i].name,CurrentToken.name)==0)

tag=1;

}if(tag==0)

{

strcpy(sT[sT_i++].name,CurrentToken.name);}

ch=fgetc(fp);

return0;

}

else

{

cout<<"error3";

exit

(1);

}

}

}

if(CurrentToken.name[0]!

='\0')

{

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

if(strcmp(CurrentToken.name,PT[i].name)==0)

{

//printf("%s<%d>\n",CurrentToken.name,PT[i].code);

printf("<%d>",PT[i].code);

strcpy(token[index].name,CurrentToken.name);

token[index++].state=PT[i].code;

break;

}

}

if(flag!

=1)

ch=fgetc(fp);

//while(ch==''||ch=='\n')ch=fgetc(fp);

return0;

}

程序运行结果:

(截屏)

输入:

Source.txt文本

intmain(void)

{

inta=1,d=2,c;

if(a<=d)

{

c=a;

a=d;

d=c;

}

charch[10]="ok";

charx,y='a';

c=a+d;

}

}

#

输出:

目录

第一章项目总论-1-

§1.1项目简介-1-

§1.2可行性研究的范围-2-

§1.3编制依据-2-

第二章项目建设背景及必要性-3-

§2.1橡胶密封件项目提出的背景-3-

§2.2国家产业政策-6-

§2.3项目建设的必要性-8-

第三章项目优势-11-

§3.1市场优势-11-

§3.2技术优势-16-

§3.3组织优势-17-

§3.4政策优势:

关中—天水经济区发展规划-17-

§3.5区域投资环境优势-17-

第四章产品介绍与技术介绍-20-

§4.1橡胶密封件产品介绍-20-

§4.2产品标准-21-

§4.3产品特征及材质-21-

§4.4产品方案-26-

§4.5产品技术来源-27-

第五章项目产品发展预测-28-

§5.1产品行业关联环境分析-28-

§5.2行业竞争格局与竞争行为-33-

§5.3竞争力要素分析-39-

§5.4项目发展预测-41-

§5.5竞争结构分析及预测-43-

第六章项目产品规划-47-

§6.1项目产品产能规划方案-47-

§6.2产品工艺规划方案-47-

§6.3项目产品营销规划方案-51-

第七章项目建设规划-58-

§7.1项目建设总规-58-

§7.2项目项目建设环境保护方案-61-

§7.3项目建设节能方案-65-

§7.4项目建设消防方案-66-

§7.5项目建设生产劳动安全方案-69-

第八章项目组织实施情况-73-

§8.1项目组织-73-

§8.2项目劳动定员和人员培训-74-

§8.3项目管理与实施进度安排-77-

§8.4工程招标-80-

第九章项目财务评价分析-82-

§9.1项目总投资及资金筹措-82-

§9.2项目财务评价依据及相关说明-83-

§9.3项目总成本费用估算-84-

§9.4销售收入、销售税金及附加和增值税估算-84-

§9.5利润分配估算-85-

§9.6借款偿还计划-85-

§9.7现金流估算-85-

§9.8不确定性分析-86-

§9.9风险分析-88-

第十章项目经济、社会效益评价-90-

§10.1经济效益评价-90-

§10.2社会效益评价-90-

第十一章可行性研究结论与建议-91-

§11.1研究结论-91-

§11.2建议-91-

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

当前位置:首页 > 表格模板 > 合同协议

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

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