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

📄 cf.cpp

📁 用C++编写的词法分析器
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>
#include<string.h>
const int MAX=120;//规定字符串的最大长度不超过120个字符
char strToken[MAX];//存放当前字符串
int str_2B[50];//存放二进制序列
char *Critical_Word[11]={"gegin","do","else","if","procedure","program","then","var","while","for","switch"};
FILE *fp;

int Isletter(char ch)//是否为英文字母
{
	if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
		return 1;
	return 0;
}
int Isdigit(char ch)//是否为数字符号
{
	if(ch>='0'&&ch<='9')
		return 1;
	return 0;
}
int Reserve()//是否为保留字
{
	int i;
	for(i=0;i<11;i++)
		if(strcmp(strToken,Critical_Word[i])==0)
			return (i+1);
	return 0;
}
void DTB()//将十进制数转化为二进制数
{
	long data=0,t=1;
	int i,j=0;
	for(i=strlen(strToken)-1;i>=0;--i)//将数字变为十进制数
	{
		data+=(strToken[i]-'0')*t;
		t*=10;
	}
	if(data==0)
		cout<<"0";
	else{
	while(data)
	{
		str_2B[j++]=data%2;
		data/=2;
	}
	for(i=j-1;i>=0;--i)
		cout<<str_2B[i];
	}//else
}//DTB()
void analysis()
{
	int i,k,code;
	char Buffer[MAX],ch;//缓冲区存放文件中每一行的内容,规定每行最多MAX=120个字符
	while(!feof(fp))
	{
	    strcpy(Buffer,"");//清空缓冲区
		fgets(Buffer,MAX,fp);
		i=0;
		while(i<MAX&&ch!='\0')
		{
			ch=Buffer[i];
			if(Isletter(ch))
			{
				k=0;
				while((Isletter(ch)||Isdigit(ch))&&i<MAX)//是标识符
				{
					strToken[k++]=ch;
					ch=Buffer[++i];
				}
				strToken[k]='\0';
				--i;//指针回移一位
				ch=' ';
				cout<<strToken;
				code=Reserve();//匹配保留字,并返回其编码值
				if(code==0)
					cout<<"<40,_>"<<"\t一般标识符"<<endl;//一般标识符
				else
					cout<<"<"<<code<<",_>"<<"\t保留字"<<endl;//保留字
				strcpy(strToken,"");
			}
			else if(Isdigit(ch))
			{
				k=0;
				while(Isdigit(ch)&&i<MAX)//是数字串
				{
					strToken[k++]=ch;
					ch=Buffer[++i];
				}
				strToken[k]='\0';
				--i;//指针回移一位
				ch=' ';
				cout<<strToken;
				cout<<"<50,";//常数
				DTB();//十进制数转化为二进制数并输出
				cout<<">"<<"\t常数"<<endl;
				strcpy(strToken,"");
			}
			else if(ch=='<')
			{
				cout<<ch;
				ch=Buffer[++i];
				if(ch=='=')//是小于等于号
					cout<<ch<<" <21,_>"<<endl;
				else//小于号
				{cout<<"<20,_>"<<endl;--i;}
			}
			else if(ch=='>')
			{
				cout<<ch;
				ch=Buffer[++i];
				if(ch=='=')//大于等于号
					cout<<ch<<" <23,_>"<<endl;
				else//大于号
				{cout<<"<22,_>"<<endl;--i;}
			}
			else if(ch==':')
			{
				cout<<ch;
				ch=Buffer[++i];
				if(ch=='=')//等号
					cout<<ch<<" <29,_>"<<endl;				
			}		
			else if(ch=='*')
			{
				cout<<ch;
				ch=Buffer[++i];
				if(ch=='*')
					cout<<ch<<" <27,_>"<<endl;//表示数的乘方
				else
				{cout<<"<28,_>"<<endl;--i;}//一般运算乘号	
			}
			else if(ch=='+')
				cout<<ch<<" <30,_>"<<endl;
			else if(ch=='-')
			    cout<<ch<<" <31,_>"<<endl;	
			else if(ch=='(')
				cout<<ch<<" <25,_>"<<endl;
			else if(ch==')')
				cout<<ch<<" <26,_>"<<endl;
			else if(ch=='?')
				cout<<ch<<" <32,_>"<<endl;
			else if(ch==',')
				cout<<ch<<" <33,_>"<<endl;
			else if(ch==';')
				cout<<ch<<" <34,_>"<<endl;			
			i++;
		}//while(i<MAX)
		ch=' ';
	}//while(!feof(fp))
	fclose(fp);
}//analysis()
int main(void)
{
	char filename[20];
	cout<<"INPUT THE FILE NAME:"<<endl;
	cin>>filename;
	if((fp=fopen(filename,"r"))==NULL)
	{
		cerr<<"Can't open the file,or the file is not exist!!!"<<endl;
		return 1;
	}
	cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~词法开始分析~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
	analysis();//调用词法分析器,并输出各单词符号
	cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~词法分析结束~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
	return 0;
}//main
			











⌨️ 快捷键说明

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