码迷,mamicode.com
首页 > 其他好文 > 详细

简单的词法分析小程序

时间:2016-10-06 22:16:05      阅读:286      评论:0      收藏:0      [点我收藏+]

标签:

 

实验:词法分析

一.实验目的:编写一个词法分析

    实验要求:输入:源程序字符串

                 输出:二元组(种别,单词本身)

二.词法分析程序设计

   词法规则:字母<a|b|c|...|z>

                 数字<0|1|2|...|9>

                整数常数:<数字>

                标识符:<变量〉

               关键字:<main|scanf|printf|...|const>

               运算符:<+|-|*|...|:=>

               界符   :<(|)|,|;|.>

   各单词对应的种别码

 技术分享

                

三:源代码展示

  1 #include<stdio.h>
  2 #include<malloc.h> 
  3 #include<stdlib.h>
  4 #include<ctype.h>
  5 typedef struct node
  6 {
  7     char ch;
  8     struct node *next;
  9 }QNode,*QueuePtr;
 10 
 11 typedef struct
 12 {
 13     QueuePtr front;
 14     QueuePtr rear;
 15 }LinkQueue;
 16 
 17 LinkQueue Q;
 18 QueuePtr p;        //定义一个指针变量 
 19 char *keyword[30]={"main","scanf","printf","void","int","float","double","char","long","short","signed",
 20                "struct","do","while","for","switch","case","break","continue","if","define","typedef","union",
 21                 "static","sizeof","return","extern","goto","auto","const"};
 22 char *operatornum[6]={"+","-","*","/","++","--"};  
 23 char *comparison[8]={"<","<=","=",">",">=","<>","==","!="};  
 24 char *interpunction[8]={",",";",":=",".","(",")","{","}"};  
 25 char *biaoshifu[6]={"%","$","^","&","_","#"};   //特殊标识符  
 26 char *zhushifu[3]={"//","/*","*/"};          //注释符  
 27 char *luoji[3]={"&&","||","!"};             //逻辑运算符  
 28 char *k="";
 29 
 30 void InitQueue()      //初始化一个带节点的空队列 
 31 {
 32     Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
 33     if(!Q.front)   
 34       exit(0);
 35     Q.front->next=NULL;
 36 }
 37 void Printf()
 38 {
 39     QueuePtr p;        //定义一个指针变量 
 40     p=Q.front;
 41     while(!(p==Q.rear))
 42     {
 43         p=p->next;
 44         printf("%c",p->ch);
 45     }
 46     printf("\n");
 47 }
 48 void Creat()    //创建队列 
 49 {
 50     char ch;
 51     QueuePtr p;
 52     printf("请输入您要分析的字符串");
 53     ch=getchar();
 54     while(ch!=@)
 55     {
 56         p=(QueuePtr)malloc(sizeof(QNode));
 57         p->ch=ch;
 58         p->next=NULL;
 59         Q.rear->next=p;
 60         Q.rear=p;
 61         ch=getchar();
 62     }
 63 }
 64 
 65 
 66 int search(char searchstr[],int wordtype)//符号匹配   
 67 {  
 68     int i;  
 69     switch (wordtype)  
 70     {  
 71         case 1:  
 72                printf("你好");
 73             for(i=0;i<30;i++)  
 74             {  
 75                 if(strcmp(keyword[i],searchstr)==0)  
 76                 return i;  
 77             }  
 78             break;  
 79         case 2:  
 80             for(i=0;i<=5;i++)  
 81             {  
 82                 if(strcmp(operatornum[i],searchstr)==0)  
 83                 return 30+i;  
 84             }  
 85          break;  
 86               
 87         case 3:   
 88             for(i=0;i<=7;i++)  
 89             {  
 90              if(strcmp(comparison[i],searchstr)==0)  
 91                 return 36+i;  
 92             }  
 93             break;  
 94      
 95         case 4:   
 96             for(i=0;i<=7;i++)  
 97             {  
 98                 if(strcmp(interpunction[i],searchstr)==0)  
 99                 return 44+i;  
100             }  
101     
102             break;  
103         case 5:   
104             for(i=0;i<=5;i++)  
105             {  
106                 if(strcmp(biaoshifu[i],searchstr)==0)  
107                     return 52+i;  
108             }  
109             break;  
110         case 6:  
111              for(i=0;i<=2;i++)  
112              {  
113                 if(strcmp(zhushifu[i],searchstr)==0)  
114                     return 58+i;  
115             }  
116             break;  
117         case 7:   
118             for(i=0;i<=2;i++)  
119             {  
120                 if(strcmp(luoji[i],searchstr)==0)  
121                     return 61+i;  
122             }  
123         break;  
124     }  
125   
126     return 0;  
127 }  
128 void Analyze()
129 {
130     char str;
131     char letter[20];  
132     char num[20];  
133     char other[20];  
134     int i;
135     p=Q.front;
136     while(p!=Q.rear)       
137     {
138         
139         p=p->next;        //获取单个字符 
140         str=p->ch;
141         if (isalpha(str)!=0)        //如果是字符 
142         {
143             i=-1;
144            while (isalnum(str)!=0)  
145           {  
146             letter[++i]=str;  
147             str=p->next->ch;  
148           }  
149            letter[i+1]=\0;  
150            if (search(letter,1))  
151           {  
152             printf("( %d,%s )",search(letter,1),letter);  
153             
154           }  
155           else  
156           {  
157               printf("( %d,%s )\n",65,letter);   
158            }  
159         }    
160         else  
161         {  
162             if (isdigit(str)!=0)  
163             {
164                 i=-1;
165                 while (isdigit(str)!=0)  
166                 {  
167                    num[++i]=str;  
168                    str=p->next->ch; 
169                 }  
170                 if(isalpha(str)!=0)         //数字后面是字符   
171                 {  
172                     while(isspace(str)==0)  
173                    {  
174                      num[++i]=str;  
175                      str=p->next->ch; 
176                     }  
177                    num[i+1]=\0;  
178                    printf("错误!非法标识符:%s\n",num);  
179                 
180                 }  
181                 num[i+1]=\0;  
182                 printf("( %d,%s )",64,num);  
183             }
184             else  
185             {
186               i=-1;    
187               if (isspace(str)!=0)  
188               {  
189                  str=p->next->ch;
190                  
191               }  
192               while ((isspace(str)==0)&&(isalnum(str)==0))  
193               {  
194                  other[++i]=str;  
195                  str=p->next->ch; 
196                }  
197                   other[i+1]=\0;  
198               if (search(other,2))  
199                   printf("( %d,%s )\n",search(other,2),other);  
200               else if (search(other,3))  
201                   printf("( %d,%s )\n",search(other,3),other);  
202               else if (search(other,4))  
203                   printf("( %d,%s )\n",search(other,4),other);  
204               else if (search(other,5))  
205                   printf("( %d,%s )\n",search(other,5),other);  
206               else if (search(other,6))  
207                   printf("( %s,注释符号 )\n",other);  
208               else if (search(other,7))  
209                   printf("( %d,%s )\n",search(other,7),other);  
210               else   
211                   printf("错误!非法字符:%s\n",other);  
212             }
213         }  
214     };  
215      printf("词法分析结束,谢谢使用!\n"); 
216 }
217 
218 int main()
219 {
220     
221     InitQueue();    //创建空链队列 
222     Creat();        //创建队列 
223     Printf();       //输出队列 
224     Analyze();      //词法分析 
225     return 0;
226 }

 

简单的词法分析小程序

标签:

原文地址:http://www.cnblogs.com/crx234/p/5934933.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!