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

📄 test.cpp

📁 通过对文档infile的读入 输出outfile的文件,outfile将infile中的编译语句分类组织
💻 CPP
字号:
#include <iostream>
#include <fstream>
#include <cstdlib>

const int SIZE=50;
const int MAX=50;

using namespace std;

void main()
{
//--------------关键词数组表-------------------------
	char Table[MAX][SIZE]={"VAR","INTEGER","BEGIN","IF","THEN","ELSE","WHILE","DO","PROCEDURE","END"};
//--------------标记数组表-------------------------------------
	int SignTable[4][MAX]={0};
//---------------------------------------------------
	int i=0,j=0,k=0;

	ifstream infile;
	ofstream outfile;
	infile.open("infile.txt");
	if(!infile.is_open())//异常处理
	{
		cout<<"无法打开文件!"<<endl;
		exit(EXIT_FAILURE);
	}
	outfile.open("outfile.txt");
	if(!outfile.is_open())//异常处理
	{
		cout<<"无法打开文件!"<<endl;
		exit(EXIT_FAILURE);
	}
	
	cout<<endl;
	cout<<"词法分析结果如下:"<<endl;
	char ch;
	char arr[MAX];
	infile.get(ch);
	while(!infile.eof())//循环到文本结尾结束
	{


//-------------------判断标示符和保留字部分----------------
		
	if(( ch>='a' && ch<='z')||( ch>='A' && ch<='Z'))
		{
			i=0;
			while(( ch>='a' && ch<='z')||( ch>='A' && ch<='Z')||( ch>='0'&& ch<='9'))
			{
				arr[i]=ch;
				i++;
				infile.get(ch);  
			}
			infile.putback(ch);
			arr[i]='\0';

			//匹配所有保留字

			if((strcmp(arr,"BEGIN")==0)||
			   (strcmp(arr,"DO")==0)||
			   (strcmp(arr,"ELSE")==0)||
			   (strcmp(arr,"END")==0)||
			   (strcmp(arr,"IF")==0)||
			   (strcmp(arr,"INTEGER")==0)||
			   (strcmp(arr,"PROCEDURE")==0)||
			   (strcmp(arr,"THEN")==0)||
			   (strcmp(arr,"VAR")==0)||
			   (strcmp(arr,"WHILE")==0))
			{
//-------------------判断保留字-------------------------------------
				for(j=0;j<=9;j++)
				{
					if(strcmp(arr,Table[j])==0)
					{
						SignTable[1][j]=1;
						break;
					}
				}

			}
			//匹配不成功则为普通标示符
			else
			{
//-------------------判断标识符是否存在数组表中----------------------------
				for(j=0;j<MAX;j++)
				{
					if(strcmp(Table[j],arr)==0)
					{
						SignTable[2][j]=1;
						break;
					}
					else if(strcmp(Table[j],"\0")==0)
					{					
						strcpy(Table[j],arr);
						SignTable[2][j]=1;
						break;
					}
				}
			}
		}
		

//-------------------判断常数部分--------------------------------------
		
		if( ch>='0' && ch<='9')
		{
			i=0;
			arr[i]=ch;//将当前字符写入字符数组
			i++;
			infile.get(ch);
			while( ch>='0' && ch<='9')//对字符第2位以后进行判断
			{
				arr[i]=ch;
				i++;
				infile.get(ch);
			}
			infile.putback(ch);
			arr[i]='\0';//将空字符补入字符数组中结束

//-------------------判断常数是否存在数组表中,存在输出,不存在插入到空位--------------------

			for(j=10;j<MAX;j++)
			{
				if(strcmp(Table[j],arr)==0)
				{
					SignTable[3][j]=1;
					break;
				}
				else if(strcmp(Table[j],"")==0)
				{					
					strcpy(Table[j],arr);
					SignTable[3][j]=1;
					break;
				}
			}
		}
	
//-------------------判断分隔符部分--------------------------

		if((ch=='+')||(ch=='*')||(ch=='(')||(ch==')')||(ch==':')||(ch==';')||(ch==',')||(ch=='=')||(ch=='>')||(ch=='<'))
		{
			i=0;
			arr[i++]=ch;//将当前字符写入字符数组
			infile.get(ch);
			while((ch=='+')||(ch=='*')||(ch=='(')||(ch==')')||(ch==':')||(ch==';')||(ch==',')||(ch=='=')||(ch=='>')||(ch=='<'))//对字符第2位以后进行判断
			{
				arr[i]=ch;
				infile.get(ch);
				i++;
			}
			infile.putback(ch);
			arr[i]='\0';

			if(strcmp(arr,":=")==0){k=4;SignTable[0][k]=1;}
			if(strcmp(arr,"+")==0) {k=5;SignTable[0][k]=1;}
			if(strcmp(arr,"*")==0) {k=6;SignTable[0][k]=1;}
			if(strcmp(arr,"(")==0) {k=7;SignTable[0][k]=1;}
			if(strcmp(arr,")")==0) {k=8;SignTable[0][k]=1;}
			if(strcmp(arr,">=")==0){k=9;SignTable[0][k]=1;}
			if(strcmp(arr,">")==0) {k=10;SignTable[0][k]=1;}
			if(strcmp(arr,"<")==0) {k=11;SignTable[0][k]=1;}
			if(strcmp(arr,"<=")==0){k=12;SignTable[0][k]=1;}
			if(strcmp(arr,"<>")==0){k=13;SignTable[0][k]=1;}
			if(strcmp(arr,";")==0) {k=14;SignTable[0][k]=1;}
			if(strcmp(arr,",")==0) {k=15;SignTable[0][k]=1;}
			if(strcmp(arr,":")==0) {k=16;SignTable[0][k]=1;}
		}

//-------------格式符-------------------------

		if((ch=='.')||(ch=='\n')||(ch==9)||(ch==32))
		{
			infile.get(ch);
		}

		if(ch==NULL)break;
		
	}
//------------------输出----------------------

	for(i=1;i<=3;i++)
	{
		for(j=0;j<=MAX;j++)
		{
			if(SignTable[i][j]==1)
			{
				cout<<"("<<i<<","<<j<<"),";
				outfile<<"("<<i<<","<<j<<"),";
			}
		}
		cout<<"\n";
		outfile<<"\n";
	}

	for(i=0;i<=MAX;i++)
	{
		if(SignTable[0][i]==1)
		{				
			cout<<"("<<i<<",-1),"<<"\n";
			outfile<<"("<<i<<",-1),"<<"\n";
		}
	}

	infile.close();
	outfile.close();
}

⌨️ 快捷键说明

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