1、运算符 :+ - * / ( )常数:十进制实数十进制整数十六进制实数十六进制整数八进制实数八进制整数1. 实验目的 实现一个词法分析程序,将输入字符串流分解成单词流供语法分析使用。2. 实验要求 输入算术运算式,输出分解后的单词流,例如: 输入(0124.3+0x35a.4f)*12 输出:运算符 (八进制实数 0124.3运算符 +十六进制实数 0x35a.4f运算符 )运算符 *十进制整数 12注意: 输入可以是键盘输入,也可以是文件输入 如果单词输入错误,必须有提示,例如:输入 12a+45*013468-0x23a3输出 错误数据12a 运算符 + 十进制整数 45 运算符 * 错误
2、数据 0123468 运算符 - 十六进制整数 0x23a3/如(0124.3+0x35a.4f)*12/如a+45*013468-0x23a3 #includestdio.h/#include stdafx.hunion chars /联合,可存储字符串,整型和浮点型 char pro_char15; int pro_number; float real;struct data /将每个单元用一个结构来存储,其内容包括:类型,所属的具体类型,以及属性值 char kind7; int id; union chars pro; ;int scan(char *a); /对每个用空格打断的单元进
3、行进一步的分析,对其进行进一步的分类void Prints(char a15,int id,int a_long); /将分析后的每个token输出void save(char *a,int id,int x); /将分析后的结果保存到一个结构数组中char nowChar15; /临时的存储单元,用来存储被空格打断以后单元char kinds118= ,INT10INT8INT16IDNREAL10REAL8REAL16 /单词的不同种别struct data link100; /用来存放词法分析以后的结果的结构数组int link_long=0; /全局变量 int scan(char *
4、a) /int id; int a_long=0; int doc=0;while(*a!=NULL) nowChar0=0; a_long=0; doc=0; /对数值的判断及处理 if(0=*a&*a case() Prints(nowChar,5,a_long); /将其具体的类型属性定义为 default: break; /判断输入的第一个字符是否为字母if(=nowChar0&nowChar0zZ while(*a!)|(*a=_) /一直将此字符串完全读入 /判断输入的字符串是否为特殊的标识符,若是,则将其具体类型值定义为 /判断输入的字符串是否为特殊的字符串if if(a_lon
5、g=2&strcmp(nowChar,if)=0) Prints(nowChar,6,a_long);/判断输入的字符串是否为特殊的字符串then if(a_long=4&then/判断输入的字符串是否为特殊的字符串else else/判断输入的字符串是否为特殊的字符串while if(a_long=5&while/判断输入的字符串是否为特殊的字符串dodo)=0) Prints(nowChar,6,a_long);/若输入的字符串不符合以上几种情况,则输入的为变量/若输入的字符串为变量,则将其具体属性值定义为Prints(nowChar,4,a_long);/如果输入的既不是数值也不是字符串
6、,则输入错误,将其具体类型之定义为else Prints(nowChar,7,a_long);return 0; return 1;main() char buf100; /用来存储从键盘上输入一串字符 char *tokenPtr; /用来存储用空格打断后的单元 int id=1; /用来存储具体的类型号 link_long=0;while(id) gets(buf); /从键盘上输入一串字符tokenPtr=strtok(buf,); /用空格将字符串打断while(id&*tokenPtr!=NULL) /分割出来的单元不为空 id=scan(tokenPtr); /将此单元进行继续分析
7、,并返回其具体的类型值 tokenPtr=strtok(NULL, /将字符串继续用空格进行分割 printf(nn getchar(); /将所分解后的单元存入结构数组中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!i+) linklink_long.kindi=kindsidi; linklink_long.pro.real=y; /id=5,6,7 /
8、若为标识符,则将单词种别定为自身,属性值定为空for(i=0;15&ai!linklink_long.kindi=ai;linklink_long.pro.pro_char0=linklink_long.pro.pro_char1=link_long+; /id=1,2,3,4 else8& /若分解后的token为变量或者整型数值,则将其单词种别直接输出 if(id=4) /若token为变量,则将其属性值设为自身 for(i=0; linklink_long.pro.pro_chari=ai; linklink_long.pro.pro_chari= else /若token为整型数值,则
9、将其相应的十进制数值赋给其属性值 linklink_long.pro.pro_number=x; /继续存入下一个token else Full 100n /结构数组已经存满return; /将词法分析器分解后的结果输出出来void Prints(char a15,int id,int a_long) int x=0; float y=0; /int float1; /char *c; if(id=1) /若为十进制整数 for(i=1;a_long&i+) x=x*10+(ai-48); printf(INT10t%sn,a); save(a,id,x,y); /存入结构数组 return;
10、 if(id=2) /若为八进制整数 x=x*8+(ai-48); /换算为十进制数INT8t%dn,x); return; if(id=3) /若为十六进制整数 for(i=2;i+) if(=ai&ai=0&i-) y=(y+(ai-48)/10; y=y+x; /整数部分与小数部分换算后相加REAL10t%fn,y); if(id=9) /若为八进制浮点型 y=(y+(ai-48)/8;REAL8t%fn if(id=10) /若为十六进制浮点型i+) /将整数部分与小数部分分割开,并进行相应的换算 x=x*16+(ai-48); for(i=strlen(a)-1; y=(y+(ai-48)/16; y=y+x; printf(REAL16t%fn save(a,id,x,y);Wrong Enter /所得的具体类型值为,则输入有错误
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1