⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 analyze.c

📁 我的词法分析程序
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#define PEND ":END"//字符串":END"表示输入的结束#define MAX_LENGTH 70//每行的最大长度/***********************************************************************************/struct InPut{char data[MAX_LENGTH];struct InPut *next;};/***********************************************************************************/struct InPut *text_input(){char forinput[MAX_LENGTH];struct InPut *p,*head,*r;head=(struct InPut *)malloc(sizeof(struct InPut));r=head;gets(forinput);while(strcmp(PEND,forinput)!=0)//如果该输入的字符串不为结束字符串的话,生成节点    {p=(struct InPut *)malloc(sizeof(struct InPut));     strcpy(p->data,forinput);     r->next=p;     r=p;     gets(forinput);    }r->next=NULL;return head;}/***********************************************************************************/int wch(char a)//{if((a>='A'&&a<='Z')||(a>='a'&&a<='z')||(a>='0'&&a<='9')||(a=='_'))return 1; else return 0;}/***********************************************************************************/print(){printf("----------------------------------------------\n"); printf("单词类型表\n"); printf("(1,基本字)\n(2,标识符)\n(3,常数)\n(4,运算符)\n(5,界符)\n"); printf("----------------------------------------------\n"); printf("关键字:\n"); printf("(1,main)\n(2,if)\n(3,int)\n(4,while)\n(5,else)\n"); printf("----------------------------------------------\n"); printf("运算符:\n"); printf("(1,'(')\n(2,')')\n(3,'>')\n(4,'<')\n(5,'+')\n(6,'-')\n(7,'*')\n(8,'/')\n"); printf("----------------------------------------------\n"); printf("界符:\n"); printf("(1,',')\n(2,';')\n"); printf("----------------------------------------------\n");}/***********************************************************************************/int wkey(char a[20])//判断是否关键字{if(strlen(a)==0)return -1; if(strcmp("main",a)==0)return 1; if(strcmp("if",a)==0)return 2; if(strcmp("int",a)==0)return 3; if(strcmp("while",a)==0)return 4; if(strcmp("else",a)==0)return 5; else return 0; }/***********************************************************************************/int wconst(char a[20])//判断是否是常数{int i=0,N; N=strlen(a); while(i<N)    {if(a[i]>='0'&&a[i]<='9')i++;     else break;    } if(i==N) return 1; else return 0;}/***********************************************************************************/main(){struct InPut *p,*q,*forprint,*head,*r,*fortest;int N,i,j,count,count1=0;char temp[20];printf("请输入源程序:\n");p=text_input();p=p->next;head=(struct InPut *)malloc(sizeof(struct InPut));//建立一个变量表r=head;r->next=NULL;//变量表的初始为空while(p!=NULL)   {i=0;j=0;	N=strlen(p->data);    while(i<=N+1)	{   if(wch(p->data[i])==1)temp[j++]=p->data[i++];	    else if(p->data[i]=='\0') {temp[j]='\0',i++;}	    else		{  temp[j]='\0';			if(wkey(temp)==0&&wconst(temp)==0)//输入字符为变量                 {count=0;			  fortest=head->next;              if(r==head)                {                 q=(struct InPut *)malloc(sizeof(struct InPut));                 strcpy(q->data,temp);                 q->next=r->next;                 r->next=q;                 r=r->next;				 count++;                }              else                 {while(fortest!=NULL)                    {if(strcmp(fortest->data,temp)==0)                       {count++;                        break;                       }                     else                        {fortest=fortest->next;                       count++;                       }                    }                  if(fortest==NULL)//将该变量加入到变量表中                    {q=(struct InPut *)malloc(sizeof(struct InPut));                     strcpy(q->data,temp);                     q->next=r->next;                     r->next=q;                     r=r->next;                     count++;                    }                 }             printf("(2,%d,%s)\n",count,temp);	         j=0;             }	    else if(wkey(temp)!=0&&wkey(temp)!=-1)//关键字	             {printf("(1,%d,%s)\n",wkey(temp),temp);		      j=0;		     }	    else if(wconst(temp)==1&&strlen(temp)!=0)//常数	             {printf("(3,%s)\n",temp);		      j=0;		     }	   switch(p->data[i])//打印界符和运算符               {case '\0':break;				case '(':printf("(4,1,'(')\n");break;                case ')':printf("(4,2,')')\n");break;                case '>':printf("(4,3,'>')\n");break;                case '<':printf("(4,4,'<')\n");break;                case '=':printf("(4,5,'=')\n");break;			    case '{':printf("(4,6,'{')\n");break;			    case '}':printf("(4,7,'}')\n");break;                case ',':printf("(5,1,',')\n");break;                case ':':printf("(5,2,';')\n");break;               }		i++;          }       }       p=p->next;          } printf("附表:\n"); print(); forprint=head->next; if(forprint==NULL)printf("该程序中没有变量\n"); else   {printf("变量:\n");      while(forprint!=NULL)	{printf("(%d,%s)\n",++count1,forprint->data);	 forprint=forprint->next;	}   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -