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

📄 word.cpp

📁 编译原理中的语法分析和语义分析
💻 CPP
字号:
#include "word.h"
#include "fstream.h"
#include "iostream.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
/*PutWord 函数的参数,RuseltFile统一采用默认的文件,文件名为result.txt*/

/*在result.txt文件中保存的每一条的信息格式为:每条一行,保存形式为:标识符+空格+编号*/

/*关键字及其编号保存在keyword.txt中,运算符及其编号保存在operator.txt中*/

/*非法输入的标识符的编号是32,合法标识符的编号是31,数字的编号为33,每次遇到回车则记录为:@+空格+34,*/

/*对于组成非法的标识符,在词法分析阶段不给出错误信息,在语法分析和代码生成阶段再给出相应的信息*/

word::word()
{
	int i;
	fstream keyfile;
	char num[9];
	keyfile.open("keyword.txt",ios::in|ios::nocreate);
	if(keyfile.fail())
	{
		cout<<"1文件打开失败!程序将退出!"<<endl;
		exit(0);
	}
	InputFile.open("ceshi.txt",ios::in|ios::nocreate);
	if(InputFile.fail())
	{
		cout<<"2文件打开失败!程序将退出!"<<endl;
		exit(0);
	}
	ResultFile.open("result.txt",ios::out|ios::nocreate);
	if(ResultFile.fail())
	{		
		cout<<"3文件打开失败!程序将退出!"<<endl;
		exit(0);
	}
	for(i=0;i<15;i++)
	{
		keyfile.getline(keyword[i],10,' ');
		keyfile.getline(num,8,'\n');
	}
}
word::~word()
{
	InputFile.close();
	ResultFile.close();
	cout<<"词法分析结束!"<<endl;
	cout<<"按任意键进入下一阶段!"<<endl;
	getch();
	cout<<"进入语法分析阶段,请稍等..........."<<endl;
	//cout<<
}
int word::WordAnalyse()//词法分析
{
	int i,length,j;
	char line[1001]="";
	cout<<"进入词法分析阶段,请稍等.............."<<endl;
	cout<<"\n输入的原程序为:"<<endl;
	while(!InputFile.eof())
	{
		line[0]=' ';
		while(1)//跳过文件中的空格
		{
			InputFile.get(line[0]);
			if(line[0]!=' ')
				break;
		}
		if(InputFile.eof())
			break;
		line[1]='\0';
		InputFile.getline(&line[1],1000,'\n');
		length=strlen(line);
		for(i=0;i<length;)
		{
			j=0;
			while(1)//跳过文件中的空格
			{
				if(line[i]!=' ')
					break;
				i++;
			}
			if(line[i]>='a'&&line[i]<='z'||line[i]>='A'&&line[i]<='Z')//输入为标识符
			{
				name[j++]=line[i];
				while(1)
				{
					i++;//指向下一个字符
					if(line[i]>='a'&&line[i]<='z'||line[i]>='A'&&line[i]<='Z'||line[i]>='0'&&line[i]<='9')
					{
						if(j<9)
							name[j++]=line[i];
					}
					else
					{
						name[j]='\0';
						JudgeWord();
						ResultFile<<name<<' '<<number<<endl;
						cout<<name<<' ';
						break;
					}	
				}
			}
			else if(line[i]>='0'&&line[i]<='9')//输入为数字
			{
				name[j++]=line[i];
				while(1)
				{
					 i++;
					 if(line[i]>='0'&&line[i]<='9')
					 {
						 if(j<9)
							 name[j++]=line[i];
						 number=33;
					 }
					 else
					 {
						 if(line[i]>='a'&&line[i]<='z'||line[i]>='A'&&line[i]<='Z')
						 {
					    	 while(1)
							 {
								 if(line[i]>='a'&&line[i]<='z'||line[i]>='A'&&line[i]<='Z')
								 {
						    		 if(j<9)
							    		 name[j++]=line[i];
						    		 i++;
								 }
						    	 else
								 {
						    		 number=32;
							    	 break;
								 }
							 }
						 }
						 break;					 
					 } 
				}
				name[j]='\0';
			    ResultFile<<name<<' '<<number<<endl;
				cout<<name<<' ';
			}
			else
			{
				switch(line[i])
				{
		    	case '=':name[j++]=line[i++];
				       	 number=16;
				         break;
		    	case '<':name[j++]=line[i++];
				    	 if(line[i]=='>')
						 {
						     name[j++]=line[i];
					   		 number=17;
							 i++;
						 }
					   	 else if(line[i]=='=')
						 {
						   	 name[j++]=line[i];
						   	 number=19;
							 i++;
						 }
					   	 else
						 {
						   	 number=18;
						 }
					   	 break;
			    case '>':name[j++]=line[i++];
					   	 if(line[i]=='=')
						 {
						   	 name[j++]=line[i++];
						   	 number=21;
						 }
				    	 else
						 {
					   		 number=20;
						 }
					   	 break;
			   	case '+':name[j++]=line[i++];
				         number=22;
				   		 break;
		     	case '-':name[j++]=line[i++];
				         number=23;
				    		 break;
			   	case '*':name[j++]=line[i++];
				   	     number=24;
				    	 break;
	    		case '/':name[j++]=line[i++];
				         number=25;
				   		 break;
			   	case ':':name[j++]=line[i++];
				    	 if(line[i]=='=')
						 {
				    		 name[j++]=line[i++];
				    		 number=26;
						 }
				   		 else
						 {
					    	 number=32;
						 }
					   	 break;
			   	case '(':name[j++]=line[i++];
				   	     number=27;
				   		 break;
			   	case ')':name[j++]=line[i++];
				         number=28;
				   		 break;
			   	case ';':name[j++]=line[i++];
				         number=29;
					   	 break;
			   	case ',':name[j++]=line[i++];
					     number=30;
				    	 break;
			   	case '.':name[j++]=line[i++];
					     number=35;
					   	 break;
		    	default:name[j++]=line[i++];
					    number=32;
				}
		       	name[j]='\0';
	        	ResultFile<<name<<' '<<number<<endl;
				cout<<name<<' ';
			}
		}
		ResultFile<<"@"<<' '<<34<<endl;
		cout<<endl;
	}
	return 1;
}
void word::JudgeWord(void)
//判断读出来的单词的编号,保存到number中
{
	int i;
	for(i=0;i<15;i++)
	{
		if(name[0]==keyword[i][0])
			if(strcmp(name,keyword[i])==0)
			{
				number=i+1;
				return;
			}
	}
	number=31;
}

⌨️ 快捷键说明

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