实验一、词法分析实验
商业软件工程 麦振澎 201506110162
一、 实验目的
对用户输入的字符串进行判断,区分它们的类型,熟悉词法分析的过程。
二、 实验内容和要求
用户输入的字符串进行判断,分别输出每个字符串所属的类型。其中的判断标准如下:
无符号整数:<整数>{<整数>}
标识符:<字母>{<字母><数字>}
数字:0|1|2|......|8|9
字母:a|b|......x|y|z
保留字:const|var|procedur|begin|end|odd|if|then|call|while|do|read|write
运算符:+|-|*|/|=|#|<|<=|>|>=|:=
界符:(|)|,|;|.
三、 实验方法、步骤及结果测试
- 源程序名:cifafenxi.c,可执行程序名:cifafenxi.exe
- 原理分析及流程图
- 主要程序段及其解释:
(1). 将保留字存放在数组中:
char const_temp[6]={'c','o','n','s','t',' '}; char var_temp[4]={'v','a','r',' '}; char procedur_temp[9]={'p','r','o','c','e','d','u','r',' '}; char begin_temp[6]={'b','e','g','i','n',' '}; char end_temp[4]={'e','n','d',' '}; char odd_temp[4]={'o','d','d',' '}; char if_temp[3]={'i','f',' '}; char then_temp[5]={'t','h','e','n',' '}; char call_temp[5]={'c','a','l','l',' '}; char while_temp[6]={'w','h','i','l','e',' '}; char do_temp[3]={'d','o',' '}; char read_temp[5]={'r','e','a','d',' '}; char write_temp[6]={'w','r','i','t','e',' '};
(2).判断数字和无符号整数:
if(ch>='0'&&ch<='9') { chtemp=getchar(); if(chtemp<'0'||chtemp>'9') { printf("数字:%c ",ch); ch=chtemp; } else { printf("无符号整数:%c",ch); ch=chtemp; while(ch>='0'&&ch<='9') { printf("%c",ch); ch=getchar(); } printf(" "); } }
(3).判断字母和标识符以及保留字:
else if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') { chtemp=getchar(); if((chtemp<'a'||chtemp>'z')&&(chtemp<'A'||chtemp>'Z')) { printf("字母:%c ",ch); ch=chtemp; } else { if(chtemp!=' '&&(ch=='v'||ch=='p'||ch=='b'||ch=='e'||ch=='o'||ch=='i'||ch=='t'||ch=='d'||ch=='r')) ch=Keyworld_first(ch,chtemp); else if(chtemp!=' '&&(ch=='w'||ch=='c')) ch=Keyworld_double(ch,chtemp); else { printf("标识符:%c%c",ch,chtemp); if(chtemp==' ')break; ch=getchar(); while(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch>='0'&&ch<='9') { printf("%c",ch); ch=getchar(); } printf(" "); } } }
(4).判断运算符:
else if(ch=='+'||ch=='-'||ch=='*'||ch=='='||ch=='<'||ch=='>'||ch==':'||ch=='/'||ch=='#') { chtemp=getchar(); if(chtemp=='='&&(ch=='>'||ch=='<'||ch==':')) { printf("运算符:%c%c ",ch,chtemp); ch=getchar(); } else { printf("运算符:%c ",ch); ch=chtemp; } }
(4).判断界符:
else if(ch=='('||ch==')'||ch==','||ch==';'||ch=='.') { printf("界符:%c ",ch); ch=getchar(); }
(5).区分保留字和标识符1:
char Keyworld_first(char temp,char temppp) { char *p; int i,number,length=-1; switch (temp) { case 'v': p=var_temp; break; case 'p': p=procedur_temp; break; case 'b': p=begin_temp; break; case 'e': p=end_temp; break; case 'o': p=odd_temp; break; case 'i': p=if_temp; break; case 't': p=then_temp; break; case 'd': p=do_temp; break; case 'r': p=read_temp; break; } for(i=0;i<9;i++) { if(p[i]==' ')break; length++; } number=0; while(temp==p[number]) { if(number==length+1)break; if(number==0) temp=temppp; else temp=getchar(); number++; } if(number==length+1&&(!(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9'))) { printf("保留字:"); for(i=0;i<=length;i++) printf("%c",p[i]); printf(" "); } else { printf("标识符:"); for(i=0;i<number;i++) printf("%c",p[i]); while(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9') { printf("%c",temp); temp=getchar(); } printf(" "); } return temp; }
(6).区分保留字和标识符2:
char Keyworld_double(char temp,char temppp) { char *p; int i,number,length=-1; switch (temp) { case 'c': if(temppp=='o') p=const_temp; else if(temppp=='a') p=call_temp; else { printf("标识符:"); printf("%c",temp); temp=temppp; while(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9') { printf("%c",temp); temp=getchar(); } printf(" "); return temp; } break; case 'w': if(temppp=='h') p=while_temp; else if(temppp=='r') p=write_temp; else { printf("标识符:"); printf("%c",temp); temp=temppp; printf("%c",temp); while(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9') { printf("%c",temp); temp=getchar(); } printf(" "); return temp; } break; } for(i=0;i<9;i++) { if(p[i]==' ')break; length++; } number=1; temp=temppp; while(temp==p[number]) { if(number==length+1)break; temp=getchar(); number++; } if(number==length+1&&(!(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9'))) { printf("保留字:"); for(i=0;i<=length;i++) printf("%c",p[i]); printf(" "); } else { printf("标识符:"); for(i=0;i<number;i++) printf("%c",p[i]); while(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9') { printf("%c",temp); temp=getchar(); } printf(" "); } return temp; }
- 运行结果及截图:
四、 实验总结
对于实现这个功能而言,最麻烦的地方莫过于要去区分标识符和保留字,因为标识符可能是保留字中的一部分或者保留字的加长,所以为了方便判断,把保留字存在数组里,在判断的过程中能够方便地调用。对于实现功能而言,不算太难,比较基础,只是有点麻烦,需要细心而已,但细心对于我来说却是一个难题,希望在以后的学习中能改变这个缺点。