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

📄 cifa.cpp

📁 从输入的源程序中
💻 CPP
字号:
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>   
#include<string.h> 
#define   LEN   sizeof(struct   Node)   
#define   NULL   0
 struct   Node   
  {char   data;   
    struct   Node   *next;   /*   定义动态链表数据结构   */   
  };    
char ch;
struct   Node   *head,*p;  
char   *key[]={"main","int","char","if","else","for","while"};   /*关键字表*/   
char   token[20];   /*字符数组,存放构成单词的符号串*/   

void getch() /*从缓冲区读入一个字符*/
{
  ch=p->data;   
  p=p->next;  
}

void getbc() /*当碰到空格时,略过*/
{
	while(ch==' ')
		getch();
}

void concat() /*将ch中的字符连接到token的后面*/
{
  unsigned   int   i;   
  i=strlen(token);   
  token[i]=ch;   
  token[i+1]='\0'; 
}

void   retract() /*指针回退一个字符*/
{
  struct   Node   *Q;   
  Q=head->next;   
  while(Q->next!=p)   
  Q=Q->next;   
  p=Q;  
}
int reserve() /*判断token中的字符串是否是关键字或是标识符*/ 
{
  int   k;   
  for(k=0;k<6;k++)   
  {   
    if(strcmp(key[k],token)==0)   return   (k+1);   
  }   
  return   10;  
} 

void   back(int   a,char   *b) /*返回函数,输出序列*/
{
  printf("(%d,%s)",a,b);
}
void   output(struct   Node   *head)  /*扫描缓冲区函数*/   
  {   if(!head)   {printf("error");exit(1);}   
      p=head->next;   
      while(p->next!=NULL)   
    {   
                        printf("%c",p->data);   
                        p=p->next;   
      }   
      printf("\n");   
  }   

void scaner()
{
  int   c;   
  token[0]=NULL;   /*将token清空*/   
  getch();   /*从缓冲区读入一个字符*/
  getbc();   /*读入一个单词*/   
  if(isalpha(ch))   /*处理字符的情况*/   
  {   
  while(isalpha(ch)||isdigit(ch))   
  {   
  concat();   /*将ch中的字符连接到token的后面*/
  getch();   
  }   
  retract();   /*指针回退一个字符*/
  c=reserve();  /*判断token中的字符串是否是关键字或是标识符*/ 
  if(c!=10)   back(c,token);  /*返回函数,输出序列*/ 
  else   back(10,token);   
  }   
  else   if(isdigit(ch))   /*处理数字的情况*/   
  {   
  while(isdigit(ch))   
  {   
  concat();   
  getch();   
  }   
  retract();   
  printf("(20,%d)",atoi(token));   
  }   
  else   
  switch(ch)     /*处理特殊符号的情况*/   
  {   
  case'+':   back(22,"+");break;   
  case'-':   back(23,"-");break;   
  case'*':   back(24,"*");break;   
  case'/':   back(25,"/");break;   
  case'<':   getch();   
                    if(ch=='=')   back(38,"<=");   
    retract();   
            back(36,"<");   
                    break;   
  case'>':   getch();   
                    if(ch=='=')   back(37,">=");   
    retract();   
    back(35,">");   
    break;   
  case';':   back(34,";");break;   
  case'{':   back(30,"{");break;   
  case'}':   back(31,"}");break;   
  case'(':   back(26,"(");break;   
  case')':   back(27,")");break;   
  case'=':   back(21,"=");break;   
  case'\n':   break;   
  default:   printf("error");break;   
  }  
}
int   main(void) 
{
  head=(struct   Node   *)malloc(LEN);
  if(!head)   {printf("error");exit(1);}
  head->next=NULL;   
  head->data=' '; 
  p=head;
  printf("if you want to finish the input,please input the '$' at the begining of the line.\n");
  printf("please input your codes:\n");
while(1)   
  {   int   i=0;   
      char   temp[256];/*每行长度不超过256个字符*/   
      gets(temp);   /*输入源程序,以行为单位*/   
      if(temp[0]=='$')   break;/*当输入的第一个字符为$时表示输入源代码结束*/   
    
      p->next=(struct   Node   *)malloc(LEN);   
            if(!(head->next))   {printf("error");exit(1);}   
      p=p->next;   
    
  while(temp[i]!='\0'   &&   i<256)             /*将输入的代码以行为单位存入缓冲区*/   
  {   
  p->data=temp[i];   
  p->next=(struct   Node   *)malloc(LEN);   
        if(!(p->next))   {printf("error");exit(1);}   
  p=p->next;   
                  i++;   
    }   
  p->data='\n';   
  p->next=NULL;             /*尾结点*/   
  }   
    
  output(head);           /*扫描缓冲区,输出结果*/   
  p=head->next;   
  while(p->next!=NULL)
	  scaner(); /*词法分析*/
  system("pause");   
  return   0; 
}

⌨️ 快捷键说明

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