编译原理课程实验报告(ExperimentsforCompilerPrinciple)北京工业大学软件学院二零一四年七月实验一:词法分析程序编制实验指导书(Scannerforatinyprogramminglanguage)实验学时:4-6学时实验类型:程序设计前修课程(含实验环节)名称:高级语言程序设计及其课程设计、数据结构及其课程设计使用专业:计算机科学与技术一、实验目的基本掌握计算机语言的词法分析程序的开发方法。二、实验内容编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。三、实验要求1.根据以下的正规式,编制正规文法,画出状态图;标识符字母(字母|数字字符)*十进制整数0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*运算符和分隔符+-*/=();关键字ifthenelsewhiledobeginend2.根据状态图,设计词法分析函数intscan(),完成以下功能:1)从键盘读入数据,分析出一个单词。2)返回单词种别(用整数表示),3)返回单词属性(不同的属性可以放在不同的全局变量中)。3.编写测试程序main(),反复调用函数scan(),输出单词种别和属性。四、实验环境PC微机Windows操作系统VisualC++程序集成环境五、实验步骤a)将正规式转换为正规文法b)根据正规文法,设计有限状态自动机c)合并各种单词的状态图,变换为确定的有限状态自动机DFAL|DL(IDN,入口)DD(NUM,值)(ASG,_)=:+(ADD,_)3421【0-70-7八进制整数56101-90-9十进制整数d)根据DFA,设计词法分析算法e)采用C语言,设计函数scan(),实现该算法f)编制测试程序(主函数main)。g)调试程序:输入一组单词,检查输出结果。六、测试数据输入数据例:092+data0x3f00while正确结果:这些单词的单词种别及其属性INT100INT1092+_IDNdata_INT1663INT80WHILE_(OCT,值)1026340-70-7其他561-90-9其他(DEC,值)其他七、实现代码//1.cpp:定义控制台应用程序的入口点。//#includestdafx.h#includestdlib.h#includestring#includeiostreamusingnamespacestd;#defineIDN1#defineASG2#defineKEY3#defineERROR-1intscan();voidKey(charbuf[]);intis0f(charch);ints09(charch);ints19(charch);ints07(charch);ints89(charch);voidIdn(charbuf[]);voidzhuanhuan(char*buf);int_tmain(intargc,_TCHAR*argv[]){inta;while(1){a=scan();if(a==0){break;}if(a==ERROR){coutInputerrorendl;system(pause);break;}}system(pause);return0;}voidKey(charbuf[]){if(strcmp(buf,if)==0){coutKEYIFendl;}elseif(strcmp(buf,then)==0){coutKEYTHENendl;}elseif(strcmp(buf,else)==0){coutKEYELSEendl;}elseif(strcmp(buf,while)==0){coutKEYWHILEendl;}elseif(strcmp(buf,do)==0){coutKEYDOendl;}elseif(strcmp(buf,begin)==0){coutKEYBEGINendl;}elseif(strcmp(buf,end)==0){coutKEYENDendl;}}voidIdn(charbuf[]){printf(IDN%s\n,buf);}ints19(charch){if(ch='1'&&ch='9'){return1;}else{return0;}}ints09(charch){if(ch='0'&&ch='9'){return1;}else{return0;}}ints07(charch){if(ch='0'&&ch='7'){return1;}else{return0;}}ints89(charch){if(ch='8'&&ch='9'){return1;}else{return0;}}voidzhuanhuan(char*buf){inti,t;longsum=0;for(i=2;buf[i];i++){if(buf[i]='9'){t=buf[i]-'0';}else{t=buf[i]-'a'+10;}sum=sum*16+t;}coutINT16sumendl;};intscan(){inta=0;intnum;charbuf[30];charch;ch=getchar();if(ch=='\n'){return0;}elseif(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch==''||ch==''||ch=='='||ch=='('||ch==')'||ch==';'){if(ch=='+'){coutADD+endl;}elseif(ch=='-'){coutSUB-endl;}elseif(ch=='*'){coutMUL*endl;}elseif(ch=='/'){coutDEV/endl;}elseif(ch==''){coutBTendl;}elseif(ch==''){coutLTendl;}elseif(ch=='='){coutEQ=endl;}elseif(ch=='('){coutLP(endl;}elseif(ch==')'){coutRP)endl;}elseif(ch==';'){coutSEMI;endl;}}elseif(isalpha(ch)){buf[a]=ch;a++;ch=getchar();while(isalpha(ch)||isdigit(ch)){buf[a]=ch;a++;ch=getchar();}ungetc(ch,stdin);buf[a]='\0';if((strcmp(buf,if)==0||strcmp(buf,then)==0||strcmp(buf,else)==0||strcmp(buf,while)==0||strcmp(buf,do)==0||strcmp(buf,begin)==0||strcmp(buf,end)==0)){Key(buf);}else{Idn(buf);}}elseif(s19(ch)){intn;buf[a]=ch;a++;ch=getchar();while(s09(ch)){buf[a]=ch;a++;ch=getchar();}buf[a]='\0';ungetc(ch,stdin);n=atoi(buf);coutINT10nendl;}elseif(ch=='0'){buf[a]=ch;a++;ch=getchar();intn;if(s07(ch)==1){while(s07(ch)){buf[a]=ch;a++;ch=getchar();}ungetc(ch,stdin);buf[a]='\0';n=atoi(buf);coutINT8nendl;}elseif(s89(ch)==1){coutINT100endl;while(s09(ch)){buf[a]=ch;a++;ch=getchar();}ungetc(ch,stdin);buf[a]='\0';n=atoi(buf);coutINT10nendl;}elseif(ch=='x'){buf[a]=ch;a++;ch=getchar();if((ch='0'&&ch='9')||(ch='a'&&ch='f')){while((ch='0'&&ch='9')||(ch='a'&&ch='f')){buf[a]=ch;a++;ch=getchar();}ungetc(ch,stdin);buf[a]='\0';zhuanhuan(buf);}else{returnERROR;}ungetc(ch,stdin);buf[a]='\0';}}}八、思考题词法分析能否采用空格来区分单词?可以程序设计中哪些环节影响词法分析的效率?如何提高效率?空格以及10进制转制输出,减少输入空格。