2022年编译原理实验—词法分析 .pdf
实验一词法分析有如下算术运算文法:1)E-E+T 2)E-E-T 3)E-T 4)T-T*F 5)T-T/F 6)T-F 7)F-(E)8)F-I 9)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)十六进制实数-0 x(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)十进制整数-名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 10 页 -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)十六进制整数-0 x(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+0 x35a.4f)*12输出:名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 10 页 -运算符(八进制实数0124.3 运算符+十六进制实数0 x35a.4f 运算符)运算符*十进制整数12 注意:输入可以是键盘输入,也可以是文件输入如果单词输入错误,必须有提示,例如:输入 12a+45*013468-0 x23a3 输出错误数据 12a 运算符+十进制整数45 运算符*错误数据0123468 运算符-十六进制整数0 x23a3/如(0124.3+0 x35a.4f)*12/如a+45*013468-0 x23a3 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 10 页 -#include#include/#include stdafx.h union chars /联合,可存储字符串,整型和浮点型char pro_char15;int pro_number;float real;struct data /将每个单元用一个结构来存储,其内容包括:类型,所属的具体类型,以及属性值char kind7;int id;union chars pro;int scan(char *a);/对每个用空格打断的单元进行进一步的分析,对其进行进一步的分类void Prints(char a15,int id,int a_long);/将分析后的每个token 输出void save(char *a,int id,int x);/将分析后的结果保存到一个结构数组中char nowChar15;/临时的存储单元,用来存储被空格打断以后单元char kinds118=,INT10,INT8,INT16,IDN,REAL10,REAL8,REAL16;/单词的不同种别struct data link100;/用来存放词法分析以后的结果的结构数组int link_long=0;/全局变量int scan(char *a)/int id;int a_long=0;int doc=0;while(*a!=NULL)nowChar0=0;a_long=0;doc=0;/对数值的判断及处理if(0=*a&*a=9)/如果第一个字符为数值nowChara_long=*a;*a+;a_long+;/对十六进制的判断及处理if(nowChar0=0&(*a=x|*a=X)/如果第一个字符为0,且第二个字符为x,则为十六进制数nowChara_long=*a;*a+;a_long+;while(*a!=NULL&(0=*a&*a=9)|(a=*a&*a=f)|(A=*a&*a=F)|*a=.)nowChara_long=*a;/一直将此十六进制数完全读入,若为浮点型的,则加以标记if(*a=.)doc=1;名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 10 页 -*a+;a_long+;nowChara_long=0;/判断输入的十六进制数是否合法if(a_long=2)/输入的只有 x,则输入错误Prints(nowChar,7,a_long);return 0;if(doc)/输入的十六进制数是浮点型的Prints(nowChar,10,a_long);/则将其具体的类型属性定为else/输入的十六进制数是整型的Prints(nowChar,3,a_long);/则将其具体的类型属性定义为continue;/对八进制的判断及处理if(nowChar0=0&0=*a&*a=7)/如果第一个字符为0,且第二个字符,07,则为八进制数nowChara_long=*a;*a+;a_long+;while(*a!=NULL&(0=*a&*a=7)|*a=.)nowChara_long=*a;/一直将此八进制数完全读入,若为浮点型的,则加以标记if(*a=.)doc=1;*a+;a_long+;nowChara_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=.)nowChara_long=*a;/一直将此十进制数完全读入,若为浮点型的,则加以标记if(*a=.)doc=1;*a+;a_long+;nowChara_long=0;名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 10 页 -if(doc)/输入的十进制数是浮点型的Prints(nowChar,8,a_long);/则将其具体的类型属性定为else/输入的十进制数是整型的Prints(nowChar,1,a_long);/则将其具体的类型属性定义为continue;/完成了对数值的判断及处理 /对字符的判断及处理else nowChara_long=*a;*a+;a_long+;/判断输入的字符是否为运算符或其他的分隔符switch(nowChar0)case+:case-:case*:case/:case:case(:case):case=:case;:nowChara_long=0;Prints(nowChar,5,a_long);/将其具体的类型属性定义为continue;default:break;/判断输入的第一个字符是否为字母if(a=nowChar0&nowChar0=z)|(A=nowChar0&nowChar0=Z)while(*a!=NULL&(a=*a&*a=z)|(A=*a&*a=Z)|(0=*a&*a=9)|(*a=.)|(*a=_)/一直将此字符串完全读入 nowChara_long=*a;*a+;a_long+;nowChara_long=0;/判断输入的字符串是否为特殊的标识符,若是,则将其具体类型值定义为/判断输入的字符串是否为特殊的字符串if if(a_long=2&strcmp(nowChar,if)=0)Prints(nowChar,6,a_long);continue;/判断输入的字符串是否为特殊的字符串then if(a_long=4&strcmp(nowChar,then)=0)Prints(nowChar,6,a_long);名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 10 页 -continue;/判断输入的字符串是否为特殊的字符串else if(a_long=4&strcmp(nowChar,else)=0)Prints(nowChar,6,a_long);continue;/判断输入的字符串是否为特殊的字符串while if(a_long=5&strcmp(nowChar,while)=0)Prints(nowChar,6,a_long);continue;/判断输入的字符串是否为特殊的字符串do if(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);return 0;return 1;main()char buf100;/用来存储 从键盘上输入 一串字符char *tokenPtr;/用来存储用空格打断后的单元int id=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(nn);getchar();return 0;/将所分解后的单元存入结构数组中void save(char *a,int id,int x,float y)int i;if(link_long=5)if(id=8)/id=8,9,10 /若为浮点型的数值,则将浮点型的y值(转换后的)存入其属性当中且存入单词的种别for(i=0;i9&kindsidi!=0;i+)linklink_long.kindi=kindsidi;linklink_long.pro.real=y;/id=5,6,7 else /若为标识符,则将单词种别定为自身,属性值定为空for(i=0;i15&ai!=0;i+)linklink_long.kindi=ai;linklink_long.pro.pro_char0=-;linklink_long.pro.pro_char1=0;link_long+;/id=1,2,3,4 else for(i=0;i8&kindsidi!=0;i+)linklink_long.kindi=kindsidi;/若分解后的 token 为变量或者整型数值,则将其单词种别直接输出if(id=4)/若token 为变量,则将其属性值设为自身for(i=0;i15&ai!=0;i+)linklink_long.pro.pro_chari=ai;linklink_long.pro.pro_chari=0;else/若token 为整型数值,则将其相应的十进制数值赋给其属性值linklink_long.pro.pro_number=x;link_long+;/继续存入下一个token elseprintf(Full 100n);/结构数组已经存满return;/将词法分析器分解后的结果输出出来void Prints(char a15,int id,int a_long)int i;int x=0;float y=0;/int float1;/char*c;if(id=1)/若为十进制整数for(i=1;ia_long&ai!=0;i+)x=x*10+(ai-48);printf(INT10t%sn,a);save(a,id,x,y);/存入结构数组return;名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 10 页 -if(id=2)/若为八进制整数for(i=1;ia_long&ai!=0;i+)x=x*8+(ai-48);/换算为十进制数 printf(INT8t%dn,x);save(a,id,x,y);/存入结构数组return;if(id=3)/若为十六进制整数for(i=2;ia_long&ai!=0;i+)if(0=ai&ai9)x=x*16+(ai-48);/换算为十进制数else if(a=ai&ai=f)x=x*16+(ai-87);elsex=x*16+(ai-55);printf(INT16t%dn,x);save(a,id,x,y);/存入结构数组return;if(id=4)/若为变量printf(IDNt%sn,a);save(a,id,x,y);/存入结构数组return;if(id=5|id=6)/若为标识符(+,-,*,/,+以及if,else,while,then,do)printf(%st-n,a);save(a,id,x,y);/存入结构数组return;if(id=8)/若为十进制浮点型for(i=0;i=0&ai!=.;i-)y=(y+(ai-48)/10;y=y+x;/整数部分与小数部分换算后相加printf(REAL10t%fn,y);save(a,id,x,y);/存入结构数组return;if(id=9)/若为八进制浮点型名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 10 页 -for(i=1;i=0&ai!=.;i-)y=(y+(ai-48)/8;y=y+x;/整数部分与小数部分换算后相加printf(REAL8t%fn,y);save(a,id,x,y);/存入结构数组return;if(id=10)/若为十六进制浮点型for(i=2;i=0&ai!=.;i-)y=(y+(ai-48)/16;y=y+x;/整数部分与小数部分换算后相加printf(REAL16t%fn,y);/存入结构数组save(a,id,x,y);return;printf(Wrong Enter);/所得的具体类型值为,则输入有错误return;名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 10 页 -