东北大学编译原理实验1.docx
- 文档编号:26757645
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:13
- 大小:128.60KB
东北大学编译原理实验1.docx
《东北大学编译原理实验1.docx》由会员分享,可在线阅读,更多相关《东北大学编译原理实验1.docx(13页珍藏版)》请在冰豆网上搜索。
东北大学编译原理实验1
编译原理程序设计实验报告
——实验题目
班级:
计算机1507班姓名:
罗艺博学号:
一、实验目标:
词法分析扫描器的设计实现。
在程序源文件中输入类C语言程序源文件,设计词法分析扫描器,并以TOKEN类别码序列的形式输出扫描结果。
二、实验内容:
1.概要设计:
将程序大致分为:
主函数、识别器(有限自动机state_change)、词法分析器(state_to_code)三大部分。
其中,主函数所完成的功能为:
打开、读取、关闭文件(即C语言源程序),重置token串等。
识别器的功能为:
识别字符,完成token串的生成,判断词法错误等。
词法分析器的功能为:
生成token类别码,判断token是否出错等。
主函数、识别器、词法分析器关系图
2.流程图
词法分析扫描器流程图
3.关键函数
a.识别器(有限自动机state_change)
intstate_change(state,ch)词法分析器(state_to_code)
intstate_to_code(state_before,token)断函数
intIsAlpha(charc)n");
exit
(1);
}
while((ch=fgetc(fp))!
='#')
{
state_before=state;
state=state_change(state,ch);
if(state==-1)
{
printf("Err!
Stupidman!
\n");
}
elseif(state!
=0)
{
token[i++]=ch;
}
else
{
if(state_before!
=1)
{
state_to_code(state_before,token);
}
memset(token,0,10);
i=0;
state=1;
}
}
fclose(fp);
return0;
}
intstate_change(state,ch)//判断是否为CT中的小数点
{
if(state==3)
return4;
else
return-1;
}
elseif(ch=='\'')//判断是否为CT字符
{
if(state==1)
return7;
elseif(state==6)//考虑与PT相连的情况
{
state_to_code(state_before,token);
i=0;
memset(token,0,10);
return7;
}
elseif(state==8)
return9;
else
return-1;
}
elseif(ch=='\"')//判断是否为ST
{
if(state==1)
return10;
elseif(state==6)//考虑与PT相连的情况
{
state_to_code(state_before,token);
i=0;
memset(token,0,10);
return10;
}
elseif(state==11)
return12;
else
return-1;
}
else//判断是否为PT
{
if(state==1)
return6;
elseif(state==2)//考虑与IT,KT相连的情况
{
state_to_code(state_before,token);
i=0;
memset(token,0,10);
return6;
}
elseif(state==3)//考虑与CT相连的情况
{
state_to_code(state_before,token);
i=0;
memset(token,0,10);
return6;
}
elseif(state==9)//考虑与CT字符相连的情况
{
state_to_code(state_before,token);
i=0;
memset(token,0,10);
return6;
}
elseif(state==12)//考虑与ST相连的情况
{
state_to_code(state_before,token);
i=0;
memset(token,0,10);
return6;
}
elseif(state==6)
{
if(((i==1)&&(ch=='='))&&((token[0]=='>')||(token[0]=='<')||(token[0]=='=')))
{
return6;
}
else
return0;
}
else
return-1;
}
}
intstate_to_code(state_before,token)//词法分析器
{
intn;//循环
code1=0;
code2=0;
switch(state_before)
{
case2:
//KT<1X>
for(n=0;n<6;n++)
{
if(strcmp(token,KT[n])==0)
{
code1=1;
code2=n;
printf("<%d%d>\n",code1,code2);//why改变不了全局的code1,code2
break;
}
}
if(code1==0)//IT<20>
{
printf("<20>\n");
}
break;
case3:
//CT<30>
printf("<30>\n");
break;
case5:
//CT(小数)<30>
printf("<30>\n");
break;
case6:
//PT<6X>
for(n=0;n<18;n++)
{
if(strcmp(token,PT[n])==0)
{
code1=6;
code2=n;
printf("<%d%d>\n",code1,code2);//why改变不了全局的code1,code2
break;
}
}
break;
case9:
//CT字符<40>
printf("<40>\n");
break;
case12:
//ST<50>
printf("<50>\n");
break;
default:
//不被任何词识别
printf("Sorryit'sgoingwrong!
");
}
return0;
}
intIsAlpha(charc)//判断是否为字母
{
if(((c>='a')&&(c<='z'))||((c>='A')&&(c<='Z')))
return1;
else
return0;
}
intIsNum(charc)//判断是否为数字
{
if(c>='0'&&c<='9')
return1;
else
return0;
}
intIsKey(char*word)//判断是否为关键字
{
intm,n;
for(n=0;n<6;n++)
{
if((m=strcmp(word,KT[n]))==0)
{
if(n==0)
return2;
return1;
}
}
return0;
}
intIsDelimiter(char*token)//判断是否为界符
{
intm,n;
for(n=0;n<18;n++)
{
if((m=strcmp(token,PT[n]))==0)
{
if(n==0)
return2;
return1;
}
}
return0;
}
程序运行结果:
(截屏)
输入:
输出:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东北大学 编译 原理 实验