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

📄 递归下降语法分析器.txt

📁 用C++实现使用链表动态分配二维数组 用C++实现使用链表动态分配二维数组
💻 TXT
字号:
#i nclude "stdio.h"
#i nclude "malloc.h"
#i nclude "ctype.h"
#i nclude "windows.h"
#i nclude "iostream.h"

FILE *fp;
int num;

struct Lint{
 int int_x;
 struct Lint *next;
}Lint, *L,*H,*P;

struct Lchar{
 char char_ch;
 struct Lchar *next;
}Lchar,*ChL,*ChH,*ChP;

char **arr;
int *n;
int *CheckR;

void setcolor(unsigned short color)//设置字体颜色代替TC2.0下的cprintf()和textcolor()
{ 
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); 
SetConsoleTextAttribute(hCon,color);//设置输出文本属性
} 

void read(void)
{ 

 char ch;
 int i;
 int newchar;
 i=0; 
 num=0;
 newchar=0;
 do//得到字符串数组
 {
  ch=fgetc(fp);
  /*得到单词*/
  if (ch==' ' || ch=='\n' || feof(fp))
  {
   if(newchar)//这是一个新的字符串
   {
    newchar=0;
    P=malloc(sizeof(Lint));
    P->next=NULL;
    P->int_x=i;
    L->next=P;
    L=L->next;
    num=num+1;
    i=0;
   }
  }
  else
  {
   newchar=1;//新开始了一个字符串
   i++;
  }
  ChP=malloc(sizeof(Lchar));
  ChP->char_ch=ch;
  ChP->next=NULL;
  ChL->next=ChP;
  ChL=ChL->next;
 }while (!feof(fp));
 fclose(fp);
}

void creatarray(void)
{
 int i,j;
 arr=(char **)malloc(num*sizeof(char *)); 
 for(i=0;i<num;i++)
 {
  j=L->int_x;
//  printf("%d\n",j);
  *(arr+i)=(char *)malloc(j*sizeof(char));
  L=L->next;
 }
 //for(i=0;i<num;i++)
 //{
 // printf("This\t");
 // for(j=0;j<n[i];j++)
 // {
 //  arr[i][j]='a';
 //  printf("%c",arr[i][j]);
 // }
 // printf("\n");
 //}
}

void savechar(void)
{
 int i,j;
 for(i=0;i<num;i++)
 {
  for(j=0;j<n[i];j++)
  {
   while(ChL->char_ch=='\n' || ChL->char_ch==' ')
   {
    ChL=ChL->next;
   }
   arr[i][j]=ChL->char_ch;
   ChL=ChL->next;
  }
 }
 //for(i=0;i<num;i++)
 //{
 // printf("This\t");
 // for(j=0;j<n[i];j++)
 // {
 //  printf("%c",arr[i][j]);
 // }
 // printf("\n");
 //}
}

void checkchar(void)
{
 int i,j;
 for(i=0;i<num;i++)
 {
  CheckR[i]=1;
  if (!isalpha(arr[i][0]) && arr[i][0]!='_')//第一个字符不是字母或下划线
   CheckR[i]=0;
  else
  {
   for(j=1;j<n[i];j++)
   {
    if (!isalnum(arr[i][j]))//字符不是字母或数字
     CheckR[i]=0;
   }
  }
 }
// for(i=0;i<num;i++)
//  printf("%d\n",CheckR[i]);
}

void printchar(void)
{
 int i,j;
 int pri;
 int newchar;
 newchar=0;
 printf("请输入一个数字来选择打印方式:");
 scanf("%d",&pri); 
 getchar();
 if(pri%2)
 {
  for(i=0;i<num;i++)
  {
   if(CheckR[i])
   {
    setcolor(10);
    printf("True\t");
   }
   else
   {
    setcolor(8);
    printf("False\t");
   }
   for(j=0;j<n[i];j++)
   {
    printf("%c",arr[i][j]);
   }
   printf("\n");
   setcolor(7);
  }
 }
 else
 {
  i=0;
  do{
   if(ChH->char_ch==' ' || ChH->char_ch=='\n')
   {
    i=i+newchar;
    newchar=0;
   }
   else
   {
    newchar=1;
   }
   if(CheckR[i])
    setcolor(10);
   else
    setcolor(8);
   printf("%c",ChH->char_ch);
   ChH=ChH->next;   
  }while(ChH);
 }
}

main()
{
 int i;
 L=malloc(sizeof(Lint)); 
 L->int_x =0;
 L->next =NULL;
 H=L;
 ChL=malloc(sizeof(Lchar));
 ChL->char_ch=' ';
 ChL->next=NULL;
 ChH=ChL;
 num=0;
 if((fp=fopen("test.txt","r"))==NULL )
 {
  printf("can not find the file!");
 }
 else
 {
  read();
  H=H->next;
  L=H;
  //do
  //{
  // printf("%d",H->int_x );
  // H=H->next;
  //} while(H);
  H=L;
  //printf("\n%d\n",num);
  n=(int *)malloc(num*sizeof(int));
  CheckR=(int *)malloc(num*sizeof(int));
  i=0;
  do{
   n[i]=H->int_x;
   H=H->next;
   i++;
  }while(H);
  //for (i=0;i<num;i++)
  // printf("n[%d]=%d\n",i,n[i]);
  creatarray();  
  //printf("\n");
  ChH=ChH->next;
  ChL=ChH;
  //do{
  // printf("%c",ChH->char_ch);
  // ChH=ChH->next;
  //}while(ChH);
  savechar();
  checkchar();
  printchar();
  printf("\n");
 }
 setcolor(7);
 getchar();
}

⌨️ 快捷键说明

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