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

📄 phrase_analysisi.c

📁 简单的词法扫描器
💻 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 + -