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

📄 词法.cpp

📁 编译原理的简单词法分析器
💻 CPP
字号:
#include"stdio.h"
#include"iostream.h"
#include"string.h"
#include"malloc.h"
#define NULL 0
typedef struct node
{
  char data[20];
  int n;
  double h;
  long g;
  struct node *next;
}linklist;
typedef struct node1
{
  int n;
  char a;
  struct node1 *next;
}linklist1; 

linklist *build()
{
   linklist *head;
   head=(linklist *)malloc(sizeof(linklist));
   head->next=NULL;
   return head;
}

linklist1 *build1()
{
   linklist1 *head;
   head=(linklist1 *)malloc(sizeof(linklist1));
   head->next=NULL;
   return head;
}

void Add(linklist *head,char a[20],int n,double h,long g)
{
   linklist *s,*r;
   r=head;
   while(r->next!=NULL)
	   r=r->next;
   s=(linklist *)malloc(sizeof(linklist));
   strcpy(s->data,a);
   s->n=n;
   s->h=h;
   s->g=g;
   r->next=s;
   r=s;
   r->next=NULL; 
}

void Add1(linklist1 *head,int n,char a)
{
   linklist1 *s,*r;
   r=head;
   while(r->next!=NULL)
	   r=r->next;
   s=(linklist1 *)malloc(sizeof(linklist1));
   s->a=a;;
   s->n=n;
   r->next=s;
   r=s;
   r->next=NULL; 
}

void shucuo(linklist1 *head)
{
   linklist1 *r;
   r=head->next;
   while(r!=NULL)
   {
      if(r->a=='z')
		  printf("第%d行出现错误,不是正确整形数!\n",r->n);
	  else if(r->a=='s')
		  printf("第%d行出现错误,不是正确浮点形数!\n",r->n);
      else if(r->a=='f')
		  printf("第%d行出现错误,不是正确字符形!\n",r->n);
	  r=r->next;
   }
}

void shuchu(linklist *head)
{
  linklist *r;
  r=head->next;
  while(r!=NULL)
  {
    if(r->data[0]!='\0')
	  printf("%s\t\t %d\n",r->data,r->n);
	else if(r->h!=NULL)
		printf("%lf\t %d\n",r->h-1,r->n);
	else if(r->g!=NULL)
		printf("%ld\t\t %d\n",r->g-1,r->n);
	 r=r->next;
  }
}

void shuchu1(linklist *zi,linklist *fu,char b[15][10])
{	
	int r;
	printf("\n");
	printf("关键字表:\n");
    printf("关键字\t\t位置\n");
    for(r=0;r<15;r++)
        printf("%s\t\t%d\n",b[r],r);
	printf("符号表:\n");
	printf("\n");
	printf("符号\t\t位置\n");
	shuchu(fu);
	printf("\n");
    printf("字符序列表:\n");
	printf("\n");
	printf("字符\t\t位置\n");
	shuchu(zi);
    printf("\n");
	printf("按任意键字母键继续,按n结束!\n");
}

void Empty(linklist *head)
{
  linklist *r,*p;
  p=head;
  while(p->next!=NULL)
  {
     r=p->next;
	 p->next=r->next;
	 free(r);
  }
}

void Empty1(linklist1 *head)
{
  linklist1 *r,*p;
  p=head;
  while(p->next!=NULL)
  {
     r=p->next;
	 p->next=r->next;
	 free(r);
  }
}

void main()
{
  linklist *zi,*fu;
  linklist1 *cuo;
  int i_z,j,n,m,i_f,i_b,i,r,hcount,fcount;
  long x;
  char t,k,key;
  double y,s;
  char a[20];
  char f[23]={'#','\'','\"',';',',','//','?','=','-',')','(','/','||','&&','{','}','-','+','*','\n','\t',' '};
  char b[15][10]={"int","float","char","return","printf","do","while","if","else","break","static","auto","double","long","short"};
  do
  { 	 
	 hcount=1;
     fcount=0;
     fu=build();
     zi=build();
     cuo=build1();
	 printf("请输入程序\n");
	 t=getchar();
	 do 
	 { 
	   i_z=1;
	   i_f=1;
	   i_b=1;
	   if((t==' ')||(t=='\t'))
	     	 ;
	   else if(t=='\n')
	        hcount++;
	   else if((t<='9')&&(t>='0'))
	   {
		    x=0;
	    	y=0.0; 		
		    k='m';
		    while((t!='.')&&(k!='n'))
			{   
				if(t<='9'&&t>='0')
					   x=x*10+t-'0';
		           else
				      i_z=0;
                   t=getchar();
				   i=1;
                for(r=0;r<23;r++)
				  if(f[r]==t)
                    r=23;
				  {
	                k='n';
				  }	
			}
		    if(t=='.')
			{ 	
			   n=1;
			   k='m';
	  	       while(k!='n')
			   { 
				  if(t<='9'&&t>='0')
				  {    
					 s=(double)t-'0';
					 for(m=0;m<n;m++)
			            s=s/10.0;
				     y=y+s;
                     n++;
				  }
		          else if(t!='.')
				      i_f=0;
                  t=getchar();
                  i=0;
                  for(r=0;r<23;r++)
				    if(f[r]==t)
					{
                     r=23;
	                 k='n';
					}	
			   }
               y=x+y;
			}
		   if((i_z==1)&&(i==1))
		   {
			   a[0]='\0';
			   Add(zi,a,-1,NULL,x+1);
		   }
		   else if((i_f==1)&&(i==0))
		   {
			   a[0]='\0';
			   Add(zi,a,-1,y+1,NULL);
		   }
           else if((i_z==0)&&(i==1))
			     Add1(cuo,hcount,'z');
		   else if((i_f==0)&&(i==0))
			     Add1(cuo,hcount,'s');
	   }
       else if(t>='a'&&t<='z')          //标识符
		{
	       j=0;
		   k='m';
			while(k!='n'&&t!='.')
			{	
				if(((t>='a')&&(t<='z'))||((t>='0')&&(t<='9')))
				{
			        a[j]=t;
				    j++;
				}
			    else
				    i_b=0;
		        t=getchar();
                for(r=0;r<23;r++)
				  if(f[r]==t)
				  {
                    r=23;
	                k='n';
				  }	
			}
		   if(i_b==1)
		   {
		       a[j]='\0';
			   for(r=0;r<15;r++)
			     if(strcmp(a,b[r])==0)
				 {
					 Add(zi,a,r,NULL,NULL);
					 r=15;
				 }
			   if(r==15)
			   {
				   Add(fu,a,fcount,NULL,NULL);
                   Add(zi,a,fcount,NULL,NULL);
				   fcount++;
			   }
		   }
           else if(i_b==0)
			     Add1(cuo,hcount,'f');	  
	   }
	   if((t!=' ')&&(t!='\n'))
	   {
		  a[0]=t;
		  a[1]='\0';
		  Add(zi,a,-1,NULL,NULL);
	   }
       t=getchar();
	 }while(t!='#');
	 getchar();
	 printf("\n");
     if(i_z==1&&i_f==1&&i_b==1)
	    printf("程序无错!\n");
	 shucuo(cuo);
     shuchu1(zi,fu,b);
	 Empty(fu);
	 Empty(zi);
	 Empty1(cuo);
	 printf("是否结束程序,'n'结束!\n");
     scanf("%c",&key);
     getchar();
  }while(key!='n'); 
}

⌨️ 快捷键说明

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