标签:
实验一、词法分析实验
商业软件工程 符致伟 201506110157
一、 实验目的
编制一个词法分析程序
二、 实验内容和要求
输入:源程序字符串
输出:二元组(种别,单词本身)
待分析语言的词法规则
三、 实验方法、步骤及结果测试
原理分析及流程:
主要程序段及其解释:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 100 char sum[MAX],ch,token[MAX];//字符串储存,单个字符,字符提取 int a=0,zbm,n,i;//计数器,种别码 char *gjz[6]={"begin","if","then","while","do","end"}; void FX(); void main() { printf("请输入字符串,以#结束:"); do { ch=getchar(); sum[a++]=ch; }while(ch!=‘#‘); a=0; do { FX(); printf("%d\t%s\n",zbm,token); }while(zbm!=0);//直到最后一个为# getchar(); } void FX() { for(n=0;n<MAX;n++) {token[n]=‘\0‘;} n=0; ch=sum[a++]; while(ch==‘ ‘){ch=sum[a++];} if((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘))//字母或字母+数字 { do{ token[n++]=ch;//复制到提取中 ch=sum[a++]; }while((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘a‘&&ch<=‘z‘)||(ch>=‘0‘&&ch<=‘9‘)); zbm=11; for(n=0;n<6;n++)//关键字 { if(strcmp(token,gjz[n])==0) { zbm=n+1; } } a--; } else if(ch>=‘0‘&&ch<=‘9‘)//纯数字 { a--; do { token[n++]=sum[a++]; ch=sum[a]; }while(ch>=‘0‘&&ch<=‘9‘); zbm=11; return; } else { switch(ch) { case ‘+‘:zbm=13;token[0]=ch;break; case ‘-‘:zbm=14;token[0]=ch;break; case ‘*‘:zbm=15;token[0]=ch;break; case ‘/‘:zbm=16;token[0]=ch;break; case ‘:‘:zbm=17;token[0]=ch;ch=sum[a++]; if(ch==‘=‘){ token[1]=ch; zbm++; } else a--; break; case ‘<‘:zbm=20;token[0]=ch;ch=sum[a++]; if(ch==‘=‘){ token[1]=ch; zbm++; } else if(ch==‘>‘){ token[1]=ch; zbm=zbm+2; } else a--; break; case ‘>‘:zbm=23;token[0]=ch;ch=sum[a++]; if(ch==‘=‘){ token[1]=ch; zbm++; } else a--; break; case ‘=‘:zbm=25;token[0]=ch;break; case ‘;‘:zbm=26;token[0]=ch;break; case ‘(‘:zbm=27;token[0]=ch;break; case ‘)‘:zbm=28;token[0]=ch;break; case ‘#‘:zbm=0;token[0]=ch;break; default:break; } } }
运行结果及分析:
四、 实验总结
关键字的对比用过数组,在strcmp的比较中出现了问题,参考网上其他人写的,改用指针类型,字符串的存储一开始用scanf一次性存到一个字符串里,但读出来分析麻烦,改用getchar一个个字符存,这样后面字符拼起来分析,存到token字符串数组中就能跟种别码一起输出了。
标签:
原文地址:http://www.cnblogs.com/FZW1874402927/p/5960650.html