您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 编译原理实验-词法分析
WORD格式可编辑专业技术资料整理实验一词法分析有如下算术运算文法:1)E-E+T2)E-E-T3)E-T4)T-T*F5)T-T/F6)T-F7)F-(E)8)F-I9)I-十进制实数|十进制整数|十六进制实数|十六进制整数|八进制实数|八进制整数10)十进制实数-(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|8|9)(0|1|2|3|4|5|6|7|8|9)*11)八进制实数-0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*.(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*12)十六进制实数-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)*.(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)*13)十进制整数-WORD格式可编辑专业技术资料整理0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*14)八进制整数-0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*15)十六进制整数-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)*单词分类:运算符:+-*/()常数:十进制实数十进制整数十六进制实数十六进制整数八进制实数八进制整数1.实验目的实现一个词法分析程序,将输入字符串流分解成单词流供语法分析使用。2.实验要求输入算术运算式,输出分解后的单词流,例如:输入(0124.3+0x35a.4f)*12输出:WORD格式可编辑专业技术资料整理运算符(八进制实数0124.3运算符+十六进制实数0x35a.4f运算符)运算符*十进制整数12注意:输入可以是键盘输入,也可以是文件输入如果单词输入错误,必须有提示,例如:输入12a+45*013468-0x23a3输出错误数据12a运算符+十进制整数45运算符*错误数据0123468运算符-十六进制整数0x23a3//如(0124.3+0x35a.4f)*12//如a+45*013468-0x23a3WORD格式可编辑专业技术资料整理#includestring.h#includestdio.h//#includestdafx.hunionchars{//联合,可存储字符串,整型和浮点型charpro_char[15];intpro_number;floatreal;};structdata{//将每个单元用一个结构来存储,其内容包括:类型,所属的具体类型,以及属性值charkind[7];intid;unioncharspro;};intscan(char*a);//对每个用空格打断的单元进行进一步的分析,对其进行进一步的分类voidPrints(chara[15],intid,inta_long);//将分析后的每个token输出voidsave(char*a,intid,intx);//将分析后的结果保存到一个结构数组中charnowChar[15];//临时的存储单元,用来存储被空格打断以后单元charkinds[11][8]={,INT10,INT8,INT16,IDN,,,,REAL10,REAL8,REAL16};//单词的不同种别structdatalink[100];//用来存放词法分析以后的结果的结构数组intlink_long=0;//全局变量intscan(char*a){//intid;inta_long=0;intdoc=0;while(*a!=NULL){nowChar[0]='\0';a_long=0;doc=0;//对数值的判断及处理if('0'=*a&&*a='9'){//如果第一个字符为数值nowChar[a_long]=*a;*a++;a_long++;//对十六进制的判断及处理if(nowChar[0]=='0'&&(*a=='x'||*a=='X')){//如果第一个字符为0,且第二个字符为x,则为十六进制数nowChar[a_long]=*a;*a++;a_long++;while(*a!=NULL&&(('0'=*a&&*a='9')||('a'=*a&&*a='f')||('A'=*a&&*a='F')||*a=='.')){nowChar[a_long]=*a;//一直将此十六进制数完全读入,若为浮点型的,则加以标记if(*a=='.')doc=1;WORD格式可编辑专业技术资料整理*a++;a_long++;}nowChar[a_long]='\0';//判断输入的十六进制数是否合法if(a_long==2){//输入的只有x,则输入错误Prints(nowChar,7,a_long);return0;}if(doc)//输入的十六进制数是浮点型的Prints(nowChar,10,a_long);//则将其具体的类型属性定为else//输入的十六进制数是整型的Prints(nowChar,3,a_long);//则将其具体的类型属性定义为continue;}//对八进制的判断及处理if(nowChar[0]=='0'&&'0'=*a&&*a='7'){//如果第一个字符为0,且第二个字符,0~7,则为八进制数nowChar[a_long]=*a;*a++;a_long++;while(*a!=NULL&&(('0'=*a&&*a='7')||*a=='.')){nowChar[a_long]=*a;//一直将此八进制数完全读入,若为浮点型的,则加以标记if(*a=='.')doc=1;*a++;a_long++;}nowChar[a_long]='\0';if(doc)//输入的八进制数是浮点型的Prints(nowChar,9,a_long);//则将其具体的类型属性定为else//输入的十六进制数是整型的Prints(nowChar,2,a_long);//则将其具体的类型属性定义为continue;}//对十进制数的判断及处理else{while(*a!=NULL&&(('0'=*a&&*a='9')||*a=='.')){nowChar[a_long]=*a;//一直将此十进制数完全读入,若为浮点型的,则加以标记if(*a=='.')doc=1;*a++;a_long++;}nowChar[a_long]='\0';WORD格式可编辑专业技术资料整理if(doc)//输入的十进制数是浮点型的Prints(nowChar,8,a_long);//则将其具体的类型属性定为else//输入的十进制数是整型的Prints(nowChar,1,a_long);//则将其具体的类型属性定义为continue;}}//完成了对数值的判断及处理//对字符的判断及处理else{nowChar[a_long]=*a;*a++;a_long++;//判断输入的字符是否为运算符或其他的分隔符switch(nowChar[0]){case'+':case'-':case'*':case'/':case'':case'':case'(':case')':case'=':case';':nowChar[a_long]='\0';Prints(nowChar,5,a_long);//将其具体的类型属性定义为continue;default:break;}//判断输入的第一个字符是否为字母if(('a'=nowChar[0]&&nowChar[0]='z')||('A'=nowChar[0]&&nowChar[0]='Z')){while(*a!=NULL&&(('a'=*a&&*a='z')||('A'=*a&&*a='Z')||('0'=*a&&*a='9')||(*a=='.')||(*a=='_'))){//一直将此字符串完全读入nowChar[a_long]=*a;*a++;a_long++;}nowChar[a_long]='\0';//判断输入的字符串是否为特殊的标识符,若是,则将其具体类型值定义为//判断输入的字符串是否为特殊的字符串ifif(a_long==2&&strcmp(nowChar,if)==0){Prints(nowChar,6,a_long);continue;}//判断输入的字符串是否为特殊的字符串thenif(a_long==4&&strcmp(nowChar,then)==0){Prints(nowChar,6,a_long);WORD格式可编辑专业技术资料整理continue;}//判断输入的字符串是否为特殊的字符串elseif(a_long==4&&strcmp(nowChar,else)==0){Prints(nowChar,6,a_long);continue;}//判断输入的字符串是否为特殊的字符串whileif(a_long==5&&strcmp(nowChar,while)==0){Prints(nowChar,6,a_long);continue;}//判断输入的字符串是否为特殊的字符串doif(a_long==2&&strcmp(nowChar,do)==0){Prints(nowChar,6,a_long);continue;}//若输入的字符串不符合以上几种情况,则输入的为变量//若输入的字符串为变量,则将其具体属性值定义为Prints(nowChar,4,a_long);continue;}//如果输入的既不是数值也不是字符串,则输入错误,将其具体类型之定义为else{Prints(nowChar,7,a_long);return0;}}}return1;}main(){charbuf[100];//用来存储从键盘上输入一串字符char*tokenPtr;//用来存储用空格打断后的单元intid=1;//用来存储具体的类型号link_long=0;while(id){link_long=0;gets(buf);//从键盘上输入一串字符tokenPtr=strtok(buf,);//用空格将字符串打断while(id&&*tokenPtr!=NULL){//分割出来的单元不为空id=scan(tokenPtr);//将此单元进行继续分析,并返回其具体的类型值tokenPtr=strtok(NULL,);//将字符串继续用空格进行分割}}printf(\n\n);getchar();return0;}//将所分解后的单元存入结构数组中voidsave(char*a,intid,intx,floaty){inti;if(link_long100){WORD格式可编辑专业技术资料整理link[link_long].id=id;//将具体的类型值存入if(id=5){if(id=8){//id=8,9,10//若为浮点型的数值,则将浮点型的y值(转换后的)存入其属性当中且存入单词的种别for(i=0;i9&&kinds[id][i]!='\0';i++)link[link_long].kind[i]=kinds[id][i];link[link_long].pro.real=y;}//id=5,6,7else{//若为标识符,则将单词种别定为自身,属性值定为空for(i=0;i15&&a[i]!='\0';i++)link[link_long].kind[i]=a[i];link[link_long].pro.pro_char[0]='-';link[link_long].pro.pro_char[1]='\0';}link_long++;}//id=
本文标题:编译原理实验-词法分析
链接地址:https://www.777doc.com/doc-7172303 .html