📄 phrase_analysisi.c
字号:
#include <stdio.h>
#include <memory.h>
#include <ctype.h>
#include <string.h>
char save[20];/*定义缓冲函数,类似于temp*/
char *p;
char count[200];
int total;
int gross;
int num=0;
char *sum[12]={"main","if","else","for","while","do","goto","break",
"continue","int","float","char"};
/*定义保留字表*/
char *Bound[16]={"=",";",">","<",">=","<=","+","-","*","/","%",",",
"(",")","{","}"};
/*定义界限符表*/
char Mark[50][9];/*用于动态建立标识符表*/
int mark=0;
char Constx[20][5];/*用于动态建立常数表*/
int marknum=0;
void alpha()/*分析字母,数字*/
{
int i=0,j;
char *opp;
int flag=0,flag_exist=0;
int flagnum=0;
while((*p<='z')&&(*p>='a'))/*检查是否是字母while(isalpha(*p))*/
{
save[i]=*p;
p++;i++;
}
while((*p<='9')&&(*p>='0'))/*检查是否是数字while(isalnum(*p))*/
/*检查是否是数字(whileisdigit(*p))*/
{
if(i==0)
flagnum=1;
save[i]=*p;
p++;i++;
}
opp=save;
for(i=0;i<12;i++)/*把字母与保留字表核对,如果是保留字就记录*/
if(!(strcmp(opp,sum[i])))/*比较两个字符串*/
{
printf("%d ( 0 , %d )\n",num++,i);
flag=1;
}
if(flag==0)
{
for(j=0;j<=mark;j++)
if(strcmp(Mark[j],save)==0)
{
flag_exist=1;
break;
}
if(flag_exist)
printf("%d ( 2 , %d )\n",num++,j);
else
if(flagnum!=1)
{
strcpy(Mark[mark],save);
printf("%d ( 2 , %d )\n",num++,mark);
mark++;
}
}
if(flagnum==1)
{
strcpy(Constx[marknum],save);
printf("%d ( 3 , %d )\n",num++,marknum);
marknum++;
}
}
void bound()/*分析界限符*/
{
int i=0;
char *opp;
int flag=0;
if((*p=='>')||(*p=='<'))
{
save[i]=*p;
p++;i++;
flag=1;
if(*p=='=')
{
save[i]=*p;
p++;i++;
}
}
else
{
save[i]=*p;
p++;i++;
}
opp=save;
for(i=0;i<16;i++)/*把字母与界限符表核对,如果是界限符就记录*/
if(!(strcmp(opp,Bound[i])))/*比较两个字符串*/
{
printf("%d ( 1 , %d )\n",num++,i);
flag=1;
}
if(flag==0)
printf("Error boundary sign!\n");
}
main()
{
FILE *opr;
char optr[5];
int i;
memset(count,0,200);
printf("Please input you want to search file name\n");
printf("For example: You can input tttt.txt or x1.txt\n");
printf("Please :");
gets(optr);
if((opr=fopen(optr,"r"))!=0)
printf("Open file successfully!\n");
else
{
printf("Can't open file!\n");
return 1;
}
if(fread(count,sizeof(char),200,opr))
printf("Reading the file successfully!\n");
else
return 1;
printf("The source program is:\n");
printf("*****************************************************\n");
puts(count);
printf("*****************************************************\n");
p=count;
while(*p!='\0')/*文件未结束时一直循环*/
{
memset(save,0,20);
while(*p==' '||*p=='\n'||*p=='\t')
p++; /*检查是否是空格,如果是空格直接跳过*/
if((*p<='z')&&(*p>='a')||(*p<='9')&&(*p>='0'))
/*上条语句可用本条语句代替:if(isalpha(*p)||isdigit(*p))*/
alpha();
else
bound();
}
fclose(opr);
printf(" 标识符表\n");
for(i=0;i<mark;i++)
printf("%d %s\n",i,Mark[i]);
printf(" 常数表\n");
for(i=0;i<marknum;i++)
printf("%d %s\n",i,Constx[i]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -