词法分析程序

词法分析程序

实验要求:

输入:源程序字符串

输出:二元组(字符,单词符号本身)

各种单词符号对应的种别码:

程序源代码:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #define N 100
  4 void priint(char str[],int i,int semp[]);
  5 void pristring(char str[],int i,int semp[]);
  6 void prichar(char str[],int i,int semp[]);
  7 void main()
  8 {
  9     int i;
 10     int temp;
 11     char str[N];
 12     int semp[N]={0};    /*此数组用来标记str字符串里每个成员是否已进行分析,已分析为1,否则为0*/
 13     printf("输入您需要进行词法分析的源程序:");
 14     gets(str);
 15     temp=strlen(str);      /*temp所储存的是输入的字符串的长度*/
 16     for(i=0;i<temp;i++)
 17     {                      /*利用ASCII码对字符进行分类并进入各自对应的函数*/
 18         if((semp[i]==0)&&(str[i-1]<48||str[i-1]>57)&&(str[i]>=48&&str[i]<=57)){
 19             priint(str,i,semp);}/*数字*/
 20         if((semp[i]!=1)&&((str[i]>=65&&str[i]<=90)||(str[i]>=97&&str[i]<=122))){
 21             pristring(str,i,semp);}/*字母*/
 22         if((semp[i]!=1)&&((str[i]>=32&&str[i]<=47)||(str[i]>=58&&str[i]<=64)||(str[i]>=91&&str[i]<=96)||(str[i]>=123&&str[i]<=126))){
 23             prichar(str,i,semp);}/*符号*/
 24     }
 25 }
 26 
 27 void priint(char str[],int i,int semp[])
 28 {
 29     char strtemp[N]={'\0'};
 30     int j,k;
 31     for(j=0;j<N;j++)
 32     {
 33         if(str[i]<48||str[i]>57) break;
 34         strtemp[j]=str[i];
 35         semp[i]=1;
 36         i++;
 37     }
 38     printf("<11,");
 39     k=0;
 40     do{
 41         printf("%c",strtemp[k]);
 42         k++;
 43     }while(strtemp[k]!='\0');
 44     printf(">\n");
 45     strnset(strtemp,'\0',N);/*将字符串strtemp的前N个字符都设为指定字符'\0'*/ 
 46 }
 47 
 48 void pristring(char str[],int i,int semp[])
 49 {
 50     int j=0;
 51     int k;
 52     char gechar[N];
 53     char *tempp[10]={"begin","if","then","while","do","end"};  /*二维字符数组*/
 54     do{
 55           gechar[j]=str[i];
 56           semp[i]=1;
 57           i++;
 58           j++;
 59     }while((semp[i]!=1)&&((str[i]>=65&&str[i]<=90)||(str[i]>=97&&str[i]<=122)));
 60     if(strcmp(gechar,tempp[0])==0)  {printf("<1,begin>");}     /*strcmp功能:对两字符进行比较,相同返回0,不同则为其他数*/
 61     else if(strcmp(gechar,tempp[1])==0)  {printf("<2,if>");}
 62     else if(strcmp(gechar,tempp[2])==0)  {printf("<3,then>");}
 63     else if(strcmp(gechar,tempp[3])==0)  {printf("<4,while>");}
 64     else if(strcmp(gechar,tempp[4])==0)  {printf("<5,do>");}
 65     else if(strcmp(gechar,tempp[5])==0)  {printf("<6,end>");}
 66     else   {
 67         printf("<10,");
 68         for(k=0;k<j;k++)
 69         {
 70             printf("%c",gechar[k]);
 71         }
 72         printf(">\n");
 73     }
 74     strnset(gechar,'\0',N);
 75 }
 76 
 77 void prichar(char str[],int i,int semp[])
 78 {
 79     char gchar=str[i];
 80     switch(gchar)
 81     {
 82           case '+':printf("<13,%c>\n",gchar);semp[i]=1;break;
 83           case '-':printf("<14,%c>\n",gchar);semp[i]=1;break;
 84           case '*':printf("<15,%c>\n",gchar);semp[i]=1;break;
 85           case '/':printf("<16,%c>\n",gchar);semp[i]=1;break;
 86           case ':':
 87                 if(str[i+1]!='='){
 88                     printf("<17,%c>\n",gchar);
 89                     semp[i]=1;
 90                 }
 91                 else if(str[i+1]=='='){
 92                     printf("<18,%c%c>\n",gchar,str[i+1]);
 93                     semp[i]=1;
 94                     semp[i+1]=1;
 95                 }
 96                 break;
 97           case '<':
 98                 if((str[i+1]!='=')&&(str[i+1]!='>')){
 99                     printf("<20,%c>\n",gchar);
100                     semp[i]=1;
101                 }
102                 else if(str[i+1]=='='){
103                     printf("<21,%c%c>\n",gchar,str[i+1]);
104                     semp[i]=1;
105                     semp[i+1]=1;
106                 }
107                 else if(str[i+1]=='>'){
108                     printf("<22,%c%c>\n",gchar,str[i+1]);
109                     semp[i]=1;
110                     semp[i+1]=1;
111                 }
112                 break;
113           case '>':
114                 if(str[i+1]!='='){
115                     printf("<23,%c>\n",gchar);
116                     semp[i]=1;
117                 }
118                 else if(str[i+1]=='='){
119                     printf("<24,%c%c>\n",gchar,str[i+1]);
120                     semp[i]=1;
121                     semp[i+1]=1;
122                 }
123                 break;
124           case '=':
125                if((str[i-1]!='<')&&(str[i-1]!=':')&&(str[i-1]!='>')){
126                     printf("<25,%c>\n",gchar);
127                     semp[i]=1;
128                 }
129                 break;
130           case ';':printf("<26,%c>\n",gchar);semp[i]=1;break;
131           case '(':printf("<27,%c>\n",gchar);semp[i]=1;break;
132           case ')':printf("<28,%c>\n",gchar);semp[i]=1;break;
133           case '#':printf("<0,%c>\n",gchar);semp[i]=1;break;
134           default:printf("<非法字符,%c>\n",gchar);semp[i]=1; break;    /*对种码表里没有的符号都默认为非法字符*/
135     }
136 }

 

运行输出:

 

posted on 2016-10-07 20:36  228黄施策  阅读(164)  评论(1编辑  收藏  举报

导航