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

📄 1.cpp

📁 一个由c++编程的c语言的词法分析程序源代码
💻 CPP
字号:
/*
C语言词法分析程序
4.25
*/
#include<stdio.h>
#include <string.h>
#include "2.h"
#define KEYNUM 32

//output form
struct output
{
int type;
int value;
int lineno;
//int	column;
};
//keywords
char keywords[KEYNUM][10]={
	"auto","break","case","char","const","continue",
	"default","do","double","else","enum","extern",
    "float", "for","goto","if","int","long","register",
	"return","short","signed","sizeof","static","struct",
	"switch","typedef","union","unsigned","void","volatile",
	"while",
};
//符号表
char symbol1[SYMBOLNUM]={'!','@','#','$','%','^','&','*','(',')',
               '\\',
			   '-','=','_','+',
			   '|',
			   '{','}','[',']',':',';','"',
			   '\'',
			   '<',',','>','.','?','/',
};

char symbol2[20][3]={"->","++","--","<<",">>","<=",">=","==","!=","&&",
                          "||","?:","+=","-=","*=","/=","%=","&=","^=","|="
               
};



char token[50];//保存分析到的一个单词。

bool isasymbol2(char *token)
{	for(int i=0;i<20;i++)
		if(strncmp(symbol2[i],token,strlen(symbol2[i]))==0)return true;
	return false;
}

bool isakey(char *token)
{
	for(int i=0;i<32;i++)
		if(strncmp(keywords[i],token,strlen(keywords[i]))==0)return true;

	return false;
}

void fengxi(char *buf,char* symbol,int num,int lineno,FILE *fp)
{
    char c;

for(int i=0;i<num;)
{

	char token[32];
	int ti=0;//token count
	char number[50];
	int tn=0;//number count
	int j;//临时变量

	int state=-1;// 0 标识符 1 常数 2界限符 -1非法字符  3字符串 4字符
	c=buf[i];
	for(j=0;j<32;j++)
		token[j]=' ';
	if(c=='"') state=3;
	else if(c=='\'') state=4;
    else if(isaletter(c)||c=='_')state=0;
    else if(isanumber(c))state=1;
	else if(c==' '||c==9){i++;continue;}//9是TAB
	else if(isasymbol(c,symbol)) state=2;
	switch(state)
	{

	case 0://标识符
		while(isaletter(c)||isanumber(c)||c=='_')
		{ 
			if(i==num)break;
			token[ti++]=c;
		//	printf("%c 标识符\n",c);
			c=buf[++i];        
		}

		for(j=0;j<ti;j++)
		{
		printf("%c",token[j]);
        fprintf(fp,"%c",token[j]);
		}
		if(isakey(token))
		{
			printf(" 关键字 行%d\n",lineno);
			fprintf(fp," 关键字 行%d\n",lineno);
		}
		else 
		{
			printf(" 标识符 行%d\n",lineno);
			fprintf(fp," 标识符 行%d\n",lineno);
		}
		break;

	case 1://常数
		if(buf[i-1]=='+'||buf[i-1]=='-')number[tn++]=buf[i-1];
		while(isanumber(c))
		{    
				if(i==num)break;
			number[tn++]=c;
			//printf("%c 常数\n",c);		
			c=buf[++i];        
		}

		for(j=0;j<tn;j++)
		{
		printf("%c",number[j]);
        fprintf(fp,"%c",number[j]);
		}
		printf(" 常数 行%d\n",lineno);
	    fprintf(fp," 常数 行%d\n",lineno);
		break;

	case 2://界限符
		//二元界限符
        {
			char local[3];
			local[0]=c;
			local[1]=buf[i+1];
			for(int j=0;j<20;j++);
		if(isasymbol2(local))
		{
			local[2]='\0';
        printf("%s 二元界限符 行%d\n",local,lineno);
		fprintf(fp,"%s 二元界限符 行%d\n",local,lineno);
		    i=i+2;
			break;
		}
				//zhao dao 
			//	break;
		}
		if(c=='+'||c=='-')//一元界限符
		{
             if(isanumber(buf[i+1]))
			 {
				 i++;
			     break;
			 }
		}
		i++;
		printf("%c 界限符 行%d\n",c,lineno);
		fprintf(fp,"%c 界限符 行%d\n",c,lineno);
		break;
	case 3://字符串
		{
		char local[50];
		int j=1;
		local[0]='"';
		c=buf[++i]; 
		while(c!='"')
		{
		local[j]=c;
		c=buf[++i]; 
		j++;
		}
		local[j++]=buf[i++];
		local[j]='\0';
	    printf("%s 字符串 行%d\n",local,lineno);
		fprintf(fp,"%s 字符串 行%d\n",local,lineno);
		break;
		}

	case 4://字符
		{
        char local[5]; 
	    int j=1;
		local[0]='\'';
		c=buf[++i]; 
		while(c!='\'')
		{
		local[j]=c;
		c=buf[++i]; 
		j++;
		}
		local[j++]=buf[i++];
		local[j]='\0';
	    printf("%s 字符 行%d\n",local,lineno);
		fprintf(fp,"%s 字符 行%d\n",local,lineno);
		break;
		}

	case -1://非法字符 
         i++;
		printf("%c 非法字符 行%d\n",c,lineno);
		fprintf(fp,"%c 非法字符 行%d\n",c,lineno);
		break;
	}//end switch
}//end for
}


int main()
{
    //文件打开	  
       int num=0;
	   FILE *fp;
	   FILE *fp1;
	   FILE *fp2;
	   int lineno=0;
        if((fp1=fopen("源代码.txt","r"))==NULL)
		{
 			printf("不能打开文件\n");
			return 0;
		}
		if((fp2=fopen("去注释后.txt","w"))==NULL)
		{
 			printf("不能打开文件\n");
			return 0;
		}
		quzhushi(fp1,fp2);
		fclose(fp1);
		fclose(fp2);

		if((fp=fopen("去注释后.txt","r"))==NULL)
		{
 			printf("不能打开文件\n");

			return 0;
		}

		if((fp1=fopen("词法分析结果.txt","w"))==NULL)
		{
 			printf("不能打开文件\n");

			return 0;
		}
    //处理

	while(num!=-1)
	{
		char buf[50];//保存读入的一行
       // printf("\n");
		num=getline(buf,fp,'\n');
		if(num>0)
		{
        putline(buf,num);
		lineno++;
		fengxi(buf,symbol1,num,lineno,fp1);
         printf("\n");
		}
	}
	//printf("%d",min(4,3));
	//printf("%d",compare(keywords[1],keywords[1]));
	/*
	for(int i=0;i<32;i++)
	printf("%s ",keywords[i]);
	*/
    /*
	for(int i=0;i<5;i++)
	printf("%c",symbol[i]);
	*/
	//结尾
    fclose(fp);
	return 1;
}
/*
//isaletter的测试
		for(i=0;i<num;i++)
		{
		bool a=isaletter(buf[i]);
		if(a) printf("%c is a letter\n",buf[i]);
		else printf("%c is not a letter\n",buf[i]);
		}*/

⌨️ 快捷键说明

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