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

📄 词法分析.cpp

📁 希望可以帮助同学在编译原理上有有更多的理解!
💻 CPP
字号:
/**************词法分析.cpp*****************/
/*****************梁鹤**********************/
/***********实现模拟词法分析算法************/
/***********石油大学:2003.12.8 *************/

#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <ctype.h>
#include <string.h>

//fp 指向原文件temp.txt     
FILE *fp,*fp2;                        
char buffer;
//保留字集合;
char *key[12]={"main","int","do","begin","else","end","if","then","while","for","cout","cin"};
//运算符集合;
char *one[13]={"=","<=","++","--",">=","!=","==","&&","||","+","-","*","/"};
//界符集合;                  
char *two[7]={"(",")","{","}",",","<<",";"};												  
     
//若为字母则检测下面的是否为字母或数字并判断是否为保留字
char alpha(char buffer)                          
{
	int i=-1,n=0,k=0;
	char p[20];
	while ((isalpha(buffer))||(isdigit(buffer)))
	{
	    p[++i]=buffer;
	    buffer=fgetc(fp);
		n++;
	};
	p[i+1]='\0';
	for(i=0;i<12;i++)
	{
		if(strcmp(key[i],p)==0)
		{
			cout<<"保留字";
			k=1;
		}
	}
	if(k==0)cout<<"标识符  ";
	for(i=0;i<10;i++)
	{
		if(p[i]=='\0')break;
		else cout<<p[i];
		fputc(p[i],fp2);
	}
	cout<<endl;
    return(buffer);
}

//若为数字则检测下面的是否为数字;
char digit(char buffer)                          
{
	int i=-1;
	char p[10];
	while ((isdigit(buffer)))
	{
	    p[++i]=buffer;
		buffer=fgetc(fp);
	}
	p[i+1]='\0';
	cout<<"常数  ";
	for(i=0;i<10;i++)
	{
		if(p[i]=='\0')break;
		else 
		{
			cout<<p[i];
			fputc(p[i],fp2);
		}
	}
	cout<<endl;
    return(buffer);
}

//若为符号则检测下面的是否为符号;
char other(char buffer)                        
{
	int i=-1,k,m,num;
	char p[10],q[3],qq[2];
	while ((!isalpha(buffer))&&(!isdigit(buffer))&&(buffer!=' '))
	{
	    p[++i]=buffer;
	    buffer=fgetc(fp);
	};
	num=i+1;
	p[i+1]='\0';
	q[2]='\0';
	qq[1]='\0';
	//先取两个判断是否为运算符号或界符   若是则输出指针向后指两个位置;
	//若不是  则取第一个判断,指针向后指一个位置;
	for(i=0;i<num;i++)                            
	{
		qq[0]=p[i];
		m=0;
		if(p[i+1]!='\0')
		{
			q[0]=p[i];
			q[1]=p[i+1];
			for(k=0;k<13;k++)
			{
				if(strcmp(one[k],q)==0)
				{
					cout<<"运算符  "<<p[0]<<p[1]<<endl;m=1;i++;
					fputc(p[0],fp2);
					fputc(p[1],fp2);
				}
			}
			if(m!=1)
			{
				for(k=0;k<7;k++)
				{
					if(strcmp(two[k],q)==0)
					{
						cout<<"界符  "<<p[0]<<p[1]<<endl;m=1;i++;
						fputc(p[0],fp2);
						fputc(p[1],fp2);
					}
				}
			}
		}
		if(m!=1)
		{
			for(k=0;k<13;k++)
			{
				if(strcmp(one[k],qq)==0)
				{
					cout<<"运算符  "<<qq[0]<<endl;
					fputc(qq[0],fp2);						
				}
			}	
			for(k=0;k<7;k++)
			{
				if(strcmp(two[k],qq)==0)
				{
					cout<<"界符  "<<qq[0]<<endl;
					fputc(qq[0],fp2);
				}
			}
		}
		
	}
    return(buffer);
}

void main()
{
	//打开原文件temp并检查是否出错;
	if((fp=fopen("temp.txt","r"))==NULL)                
		cout<<"打开文件出错";
	else
	{
		//生成一个文件temp2存分析后的结果;
		fp2=fopen("temp2.txt","w");                  
		buffer=fgetc(fp);
		//当指针指到文件结尾的时候跳出循环
		while (!feof(fp))                          
		{
			//检测当前指针是空格,数字,字符还是其他 并调用相应的函数处理;
			if(buffer==' ')                        
				buffer=fgetc(fp);
			else if (isalpha(buffer))
				buffer=alpha(buffer);
			else if (isdigit(buffer))
				buffer=digit(buffer);
			else buffer=other(buffer);
		};
		cout<<"完成:)"<<endl;
		//关闭生成文件temp2;

		fclose(fp2);            
	}
}

⌨️ 快捷键说明

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