词法分析程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了词法分析程序相关的知识,希望对你有一定的参考价值。

词法分析程序

实验要求:

输入:源程序字符串

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

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

技术分享

程序源代码:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #define N 100
  4 void pristring(char str[],int i,int semp[]);
  5 void prichar(char str[],int i,int semp[]);
  6 void main()
  7 {
  8     int i,j,k;
  9     int temp;
 10     char str[N];
 11     char strtemp[N]={\\0};
 12     int semp[N]={0};
 13     printf("输入您需要进行词法分析的源程序:");
 14     gets(str);
 15     temp=strlen(str);
 16     for(i=0;i<temp;i++)
 17     {
 18         if((semp[i]==0)&&(str[i-1]<48||str[i-1]>57)&&(str[i]>=48&&str[i]<=57))
 19         {
 20             for(j=0;j<N;j++)
 21             {
 22                 if(str[i]<48||str[i]>57) break;
 23                 strtemp[j]=str[i];
 24                 semp[i]=1;
 25                 i++;
 26             }
 27             printf("<11,");
 28             k=0;
 29             do{
 30                 printf("%c",strtemp[k]);
 31                 k++;
 32             }while(strtemp[k]!=\\0);
 33             printf(">\\n");
 34             strnset(strtemp,\\0,N);/*将字符串strtemp的前N个字符都设为指定字符‘\\0‘*/ 
 35         }
 36         if((semp[i]!=1)&&((str[i]>=65&&str[i]<=90)||(str[i]>=97&&str[i]<=122))){
 37             pristring(str,i,semp);}
 38         prichar(str,i,semp);
 39     }
 40 }
 41 
 42 void pristring(char str[],int i,int semp[])
 43 {
 44     int j=0;
 45     int k;
 46     int r[10]={1,1,1,1,1,1,1,1,1,1};
 47     char gechar[N];
 48     char *tempp[10]={"begin","if","then","while","do","end"};
 49     do{
 50           gechar[j]=str[i];
 51           semp[i]=1;
 52           i++;
 53           j++;
 54     }while((semp[i]!=1)&&((str[i]>=65&&str[i]<=90)||(str[i]>=97&&str[i]<=122)));
 55     if(strcmp(gechar,tempp[0])==0)  {printf("<1,begin>");}
 56     else if(strcmp(gechar,tempp[1])==0)  {printf("<2,if>");}
 57     else if(strcmp(gechar,tempp[2])==0)  {printf("<3,then>");}
 58     else if(strcmp(gechar,tempp[3])==0)  {printf("<4,while>");}
 59     else if(strcmp(gechar,tempp[4])==0)  {printf("<5,do>");}
 60     else if(strcmp(gechar,tempp[5])==0)  {printf("<6,end>");}
 61     else   {
 62         printf("<10,");
 63         for(k=0;k<j;k++)
 64         {
 65             printf("%c",gechar[k]);
 66         }
 67         printf(">\\n");
 68     }
 69     strnset(gechar,\\0,N);
 70 }
 71 
 72 void prichar(char str[],int i,int semp[])
 73 {
 74     char gchar=str[i];
 75     switch(gchar)
 76     {
 77           case +:printf("<13,%c>\\n",gchar);semp[i]=1;break;
 78           case -:printf("<14,%c>\\n",gchar);semp[i]=1;break;
 79           case *:printf("<15,%c>\\n",gchar);semp[i]=1;break;
 80           case /:printf("<16,%c>\\n",gchar);semp[i]=1;break;
 81           case ::
 82                 if(str[i+1]!==){
 83                     printf("<17,%c>\\n",gchar);
 84                     semp[i]=1;
 85                 }
 86                 else if(str[i+1]===){
 87                     printf("<18,%c%c>\\n",gchar,str[i+1]);
 88                     semp[i]=1;
 89                     semp[i+1]=1;
 90                 }
 91                 break;
 92           case <:
 93                 if((str[i+1]!==)&&(str[i+1]!=>)){
 94                     printf("<20,%c>\\n",gchar);
 95                     semp[i]=1;
 96                 }
 97                 else if(str[i+1]===){
 98                     printf("<21,%c%c>\\n",gchar,str[i+1]);
 99                     semp[i]=1;
100                     semp[i+1]=1;
101                 }
102                 else if(str[i+1]==>){
103                     printf("<22,%c%c>\\n",gchar,str[i+1]);
104                     semp[i]=1;
105                     semp[i+1]=1;
106                 }
107                 break;
108           case >:
109                 if(str[i+1]!==){
110                     printf("<23,%c>\\n",gchar);
111                     semp[i]=1;
112                 }
113                 else if(str[i+1]===){
114                     printf("<24,%c%c>\\n",gchar,str[i+1]);
115                     semp[i]=1;
116                     semp[i+1]=1;
117                 }
118                 break;
119           case =:
120                if((str[i-1]!=<)&&(str[i-1]!=:)&&(str[i-1]!=>)){
121                     printf("<25,%c>\\n",gchar);
122                     semp[i]=1;
123                 }
124                 break;
125           case ;:printf("<26,%c>\\n",gchar);semp[i]=1;break;
126           case (:printf("<27,%c>\\n",gchar);semp[i]=1;break;
127           case ):printf("<28,%c>\\n",gchar);semp[i]=1;break;
128           case #:printf("<0,%c>\\n",gchar);semp[i]=1;break;
129           default: break;
130     }
131 }

运行输出:

技术分享

以上是关于词法分析程序的主要内容,如果未能解决你的问题,请参考以下文章

词法分析

词法分析程序的实现

Second-词法分析

词法分析程序源代码

实验词法分析实验

词法分析程序