实验一、词法分析实验
专业 商业软件工程 姓名 胡德霖 学号 201506110208
一、 实验目的
输入字符串,显示字符串和种别码
二、 实验内容和要求
将输入的字符串通过词法分析器一一识别出来,同时将该字符串或者字符并且和种别码一起输出来。
三、 实验方法、步骤及结果测试
- 1. 程序名:词法分析.c
可执行程序名:词法分析.exe
- 2. 原理分析及流程图
主要总体设计问题。
采用数组存放数据,通过字符串的比较实现关键字的种别码输出。
问题:当输入连续的关键字时如ifif后面一个无法识别.
解决:当输出完一个关键字后就释放token的数组
- 3. 主要程序段及其解释:
-
#include <stdio.h> #include <string.h> #define MAX 100 main() { int i=0,j,n,syn; char num[MAX],standard[6][10]={"begin","if","then","while","do","end"},string[MAX],token[MAX],ch; printf("请输入一串字符,以#结尾:"); do{ scanf("%c",&ch); string[i]=ch; i++; }while(ch!='#'); string[i]='#'; i=0; do{ for(j=0;j<MAX;j++) token[j]=''; for(j=0;j<MAX;j++) num[j]=''; ch=string[i]; i++; while(ch==' '||ch==' ') { ch=string[i]; i++; } j=0; while(ch>='a'&& ch<='z' || ch>='A'&&ch<='Z') /*判断是否为字符关键字*/ { token[j]=ch; ch=string[i]; i++; j++; for(n=0;n<6;n++) { if(strcmp(token,standard[n])==0) { syn=n+1; printf("%s,种别码%d ",standard[n],syn); for(j=0;j<MAX;j++) token[j]=''; j=0; } } } while(ch>='0'&& ch<='9') /*判断是否为数字*/ { num[j]=ch; ch=string[i]; i++; j++; } if(num[0]>='0'&&num[0]<='9') printf("%s,种别码%d ",num,syn=11); for(j=0;j<MAX;j++) num[j]=''; j=0; switch(ch) { case '+': syn=13; printf("%c,种别码%d ",ch,syn); break; case '-': syn=14; printf("%c,种别码%d ",ch,syn); break; case '*': syn=15; printf("%c,种别码%d ",ch,syn); break; case '/': syn=16; printf("%c,种别码%d ",ch,syn); break; case ':': ch=string[i]; i++; if(ch=='=') { syn=18; printf("%c%c,种别码%d ",token[j-1],ch,syn); } else { syn=17; printf("%c,种别码%d ",ch,syn); i--; } break; case '<': token[j]=ch; j++; ch=string[i]; i++; if(ch=='=') { syn=21; printf("%c%c,种别码%d ",token[j-1],ch,syn); } else { syn=20; printf("%c,种别码%d ",ch,syn); i--; } break; case '>': token[j]=ch; j++; ch=string[i]; i++; if(ch=='=') { syn=24; printf("%c%c,种别码%d ",token[j-1],ch,syn); } else{ syn=23; printf("%c,种别码%d ",ch,syn); i--; } break; case '=': syn=25; printf("%c,种别码%d ",ch,syn); break; case ';': syn=26; printf("%c,种别码%d ",ch,syn); break; case '(': syn=27; printf("%c,种别码%d ",ch,syn); break; case ')': syn=28; printf("%c,种别码%d ",ch,syn); break; default: i--; break; } }while(ch!='#'); getchar(); getchar(); }
利用string数组储存用户输入的字符串再一个个读取字符,当读到字母就用token数组存放,读完后再对照是否为关键字,当为其他字符时再判断输出。
- 4. 运行结果及分析
四、 实验总结
心得体会,在这次的实验中了解词法分析的过程,解决一些问题。在完成我的词法分析器的时候考虑到关键字固定的字符串,这就有利于字符串的比较,从而识别出对应的种别码。因为是第一次接触,显得有些不知所措,不知道从何下手,最后经过努力,勉勉强强算是完成了吧。