资源描述:
《东北大学编译原理实验1.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译原理程序设计实验报告——实验题目班级:计算机1507班姓名:罗艺博学号:20154377一、实验目标:词法分析扫描器的设计实现。在程序源文件中输入类C语言程序源文件,设计词法分析扫描器,并以TOKEN类别码序列的形式输出扫描结果。二、实验内容:1.概要设计:将程序大致分为:主函数、识别器(有限自动机state_change)、词法分析器(state_to_code)三大部分。其中,主函数所完成的功能为:打开、读取、关闭文件(即C语言源程序),重置token串等。识别器的功能为:识别字符,完成
2、token串的生成,判断词法错误等。词法分析器的功能为:生成token类别码,判断token是否出错等。主函数、识别器、词法分析器关系图2.流程图词法分析扫描器流程图3.关键函数a.识别器(有限自动机state_change)intstate_change(state,ch)//识别器,有限自动机{if((ch=='')
3、
4、(ch=='t')
5、
6、(ch==''))//略去空格、TAB、换行return0;elseif((IsAlpha(ch)==1)
7、
8、(ch=='_'))//判断是否为字
9、母或'_',从而判断是关键字、标识符、CT字符还是ST字符串{if(state==1)return2;elseif(state==2)return2;elseif(state==7)return8;elseif(state==8)return8;elseif(state==10)return11;elseif(state==11)return11;elseif(state==6)//考虑与PT相连的情况{state_to_code(state_before,token);i=0;memset(t
10、oken,0,10);return2;}elsereturn-1;}elseif(IsNum(ch)==1)//判断是否为数字,从而进一步判断是为IT,CT,KT{if(state==1)return3;elseif(state==2)return2;elseif(state==3)return3;elseif(state==4)return4;elseif(state==5)return5;elseif(state==6)//考虑与PT相连的情况{state_to_code(state_bef
11、ore,token);i=0;memset(token,0,10);return3;}elsereturn-1;}elseif(ch=='.')//判断是否为CT中的小数点{if(state==3)return4;elsereturn-1;}elseif(ch==''')//判断是否为CT字符{if(state==1)return7;elseif(state==6)//考虑与PT相连的情况{state_to_code(state_before,token);i=0;memset(token,0
12、,10);return7;}elseif(state==8)return9;elsereturn-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;elsereturn-1;}else//判断是否为PT{i
13、f(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_t
14、o_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]=='>')
15、
16、(token[0]=='<')
17、
18、(token[0]=='='))){r