资源描述:
《燕大编译原理实验词法分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、#include#include#includeusingnamespacestd;#definekeyword_num13#definedelimiter_num5#definewords_num200#definestr_num10//变量定义charstr[str_num];//str用于存放接收的单词charwords[words_num][str_num];inti=0,n=-1,j=1,k;//i作str的下标,n作数组words行的下标intline_num
2、=1;charc;char*keyword[keyword_num]={"begin","call","const","do","end","if","odd","procedure","read","then","var","while","write"};//关键字13个按照顺序排列便于折半查找chardelimiter[delimiter_num]={'(',')',';','.',','};//分界符5个FILE*fout;//存放分词结果的文件ifstreamfin;strings;intmain(){printf
3、("输入文件名:");cin>>s;fin.open(s.c_str());while(!fin.is_open()){printf("文件不存在,请重新输入:");fin.clear();cin>>s;fin.open(s.c_str());}printf("行(类别单词)");//打开文件“分析结果.txt”,将分词结果写到该文件中fout=fopen("分析结果.txt","w");fprintf(fout,"行(类别单词)");if(!fin.eof())c=fin.get();while(1){//忽略回车
4、、tab键和空格,且当是回车时,行号加1while(c==10
5、
6、c==9
7、
8、c==''){if(c==10)++line_num;if(!fin.eof())c=fin.get();}j=1;if(fin.eof())break;//关键字或标识符的接收,以字母或下划线开头if(c>='a'&&c<='z'
9、
10、c>='A'&&c<='Z'
11、
12、c=='_'){str[0]=c;while(1){if(!fin.eof())c=fin.get();//第二个字符接收字母或数字或下划线if(c>='a'&&c<='z'
13、
14、c>=
15、'A'&&c<='Z'
16、
17、c>='0'&&c<='9'
18、
19、c=='_')str[++i]=c;elsebreak;}strcpy(words[++n],str);//将分离的词放入word中//折半查找关键字inta=0;intb=keyword_num-1;do{k=(a+b)/2;if(strcmp(str,keyword[k])<=0){b=k-1;}if(strcmp(str,keyword[k])>=0){a=k+1;}}while(a<=b);if(a-1>b){//输出关键字,以行号,二元组(类型,单词)格式p
20、rintf("%-5d(关键字,%-10s)",line_num,str);fprintf(fout,"%-5d(关键字,%-10s)",line_num,str);}else{//输出标识符printf("%-5d(标识符,%-10s)",line_num,str);fprintf(fout,"%-5d(标识符,%-10s)",line_num,str);}for(;i>=0;i--)str[i]=' ';i=0;}//常数接收,以数字或负号开头elseif('0'<=c&&c<='9'
21、
22、c=='-'
23、
24、
25、c=='.'){intflag=0;str[0]=c;while(1){if(!fin.eof())c=fin.get();//接收数字或小数点if('0'<=c&&c<='9'
26、
27、c=='.'){str[++i]=c;flag=0;}//取到以数字开头的字符串以出错处理elseif(str[0]!='-'&&(c>='a'&&c<='z'
28、
29、c>='A'&&c<='Z'
30、
31、c=='_')){str[++i]=c;flag=1;}elseif(str[0]=='-'&&c=='-'){j=0;flag=2;break;}e
32、lseif(str[0]!='-'&&c=='-'){j=0;flag=2;break;}elseif(str[0]=='-'&&(c>='a'&&c<='z'
33、
34、c>='A'&&c<='Z')){j=0;flag=2;break;}elseif(str[0]=='.'&&('0'>=c
35、