📄 递归下降语法分析器.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 + -