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

📄 main.cpp

📁 新做词法分析程序
💻 CPP
字号:
#include<fstream.h>
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#include<iomanip.h>
#define  MAX 255
#define  Row  8
#define  LISTINCREMENT	2		//线性存储空间分配增量和初始量
static int cu=0;
struct reserve					//定义结构体,用以保留保留字符			
{
	char num[Row];
	char bn[10];
};

struct reserve Zi[13]={{"(3,0)","program"},{"(4,0)","var"},{"(5,0)","procedure"},{"(6,0)","begin"},
{"(7,0)","end"},{"(8,0)","if"},{"(9,0)","then"},{"(10,0)","else"},{"(11,0)","while"},
{"(12,0)","do"},{"(13,0)","call"},{"(14,0)","integer"},{"(15,0)","real"}};//保留字表

struct identifer				//结构体处理
{
	char id[10];
};

identifer *newbase;		    	//用于增加存储分配空间

struct  Assign					//用于增加存储分配空间
{
 identifer *BL;					//存储空间基址
 int length;					//当前长度
 int listsize;					//当前分配的存储容量
} SqList;

void InitList_Sq (Assign &L)	//初始化线性表
{
	L.BL=(identifer*)malloc(LISTINCREMENT*sizeof(identifer));
	if(!L.BL) exit(1);			//分配失败
	L.length=0;
	L.listsize=LISTINCREMENT;
}
void ChangeLine()				//用于换行,每输出四个换行
{
	static int Line;
	Line++;
	if(Line%4==0)
		cout<<endl;
}
void Alphaprocess(char *frp)	//处理字母,包括保留字和标志符
{	
	char *r;r=new char;
	for(int i=0;i<13;i++)
	{
		if(strcmp(frp,Zi[i].bn)==0)//是否为保留字
		{
			cout<<Zi[i].num<<setiosflags(ios::left)<<setw(12)<<Zi[i].bn;
			ChangeLine();
			return;
		}
	}
	int t=0;
	if(strlen(frp)<Row)			//不是保留字,有效字符不大于8
		{
			for(;*frp!=0;frp++)
			{
				r[t]=*frp;t++;	
			}r[t]='\0';
		}
	else						//不是保留字,有效字符大于8
		{
			for(int temp3=0;temp3<Row;temp3++)
				r[temp3]=frp[temp3];
				r[temp3]='\0';
		}
	for(int temp2=0;temp2<=cu;temp2++)
		{
			if(strcmp(SqList.BL[temp2].id,r)==0)//标识符以前出现过
			{cout<<"(1,"<<(temp2+1)<<")"<<setiosflags(ios::left)<<setw(10)<<r;
			ChangeLine();
			return;}
		}	
	cout<<"(1,"<<cu+1<<")"<<setiosflags(ios::left)<<setw(11)<<r;//没出现过
	ChangeLine();	t=0;
	for(;*r!=0;r++)				//赋值,把新的标志符存放到数组中去
		{
			SqList.BL[cu].id[t]=*r;
			t++;
		}
	SqList.BL[cu].id[t]='\0';
	SqList.length++;
	if(SqList.length>=SqList.listsize)//增加分配空间
		{
			newbase=(identifer*)realloc(SqList.BL,(SqList.listsize+LISTINCREMENT)*sizeof(identifer));
			if(!newbase)exit(1);
			SqList.BL=newbase;
			SqList.listsize=SqList.listsize+LISTINCREMENT;
		}	cu++;
}

void process(char * frp)
{	
int i=0;char temp[MAX];char ch;
static int flags=0;
static int err=0;
for(int cl=0;cl<=int (strlen(frp));cl++)
		temp[cl]='\0';	
while(frp[i]!='\0')							 //字符结束标志
{	
	if(flags==1)													
	{
		while(frp[i+1]!='\0'&&(frp[i]!='*'||frp[i+1]!='/'))
			i++;
		if(frp[i+1]=='\0')return;			//用以处理多行注释
		if(frp[i]=='*'&&frp[i+1]=='/') 
		{
			flags=0;
			i=i+2;
			if(frp[i]!='\0')
			ch=frp[i];
			else return;
		}
	}
	else
		ch=frp[i];
	if( ch==' '|| ch =='\t')				//过滤掉空格和tab
	{
		while(ch==' '|| ch =='\t')
		{
			i++;
			ch=frp[i];
		}
	}
	else if (isdigit(ch))					//首字为数字的情况
		{
			int j=0;
			while(isdigit(ch)||isalpha(ch))//判断是否为错误标识符
			{	
				
				temp[j]=ch;
				i++;j++;
				ch=frp[i];
			}
			for(int x=0;x<j;x++)
			if(isalpha(temp[x]))
			{cout<<setiosflags(ios::left)<<"*error("<<++err<<")*";goto L;}
			cout<<"(2,";
			for(x=0;x<j;x++)
			cout<<temp[x];
			cout<<")";
			for( x=0;x<j;x++)
				cout<<temp[x];
		L:	cout<<"\t";
			ChangeLine();
			for(int cl=0;cl<j;cl++)
		temp[cl]='\0';
		}
	else if(isalpha(ch))					//首字是字母的情况
		{
			int t=0;
			while(isalpha(ch)||isdigit(ch))
			{
				if(ch>='A'&&ch<='Z')
				{
					int ring=ch+32;
					 ch=(char)ring;
				}
				temp[t]=ch;
				i++;t++;
				ch=frp[i];
			}
			Alphaprocess(temp);				//调用字母处理函数
			for(int cl=0;cl<t;cl++)
			temp[cl]='\0';
		}
	else if(ch==':')
		{
			i++;
			ch=frp[i];
			if(ch=='=')
			{	cout<<setiosflags(ios::left)<<setw(16)<<"(29,0):=";	ChangeLine();i++;}
			else
			{cout<<setiosflags(ios::left)<<setw(16)<<"(35,0):";ChangeLine();}
			
		}
	else if(ch=='>')
		{
			i++;ch=frp[i];
			if(ch=='=')
				{cout<<setiosflags(ios::left)<<setw(16)<<"(26,0)>=";ChangeLine();i++;}
			else
			{cout<<setiosflags(ios::left)<<setw(16)<<"(25,0)>";ChangeLine();}
		}
	else if(ch=='<')
		{
				i++;
			ch=frp[i];
			if(ch=='=')
				{	cout<<setiosflags(ios::left)<<setw(16)<<"(24,0)<=";i++;}
			else if(ch='>')
				{	cout<<setiosflags(ios::left)<<setw(16)<<"(28,0)<>";i++;}
			else
				{cout<<setiosflags(ios::left)<<setw(16)<<"(23,0)<";}
			ChangeLine();
		}
	else if(ch=='/')			               	//对注释的考虑及处理
	{
		i++;
		ch=frp[i];
		if(ch=='/')  return;					  //单行注释处理
		else if(ch=='*')  {
			flags=1;
		i++;ch=frp[i];}//多行注释处理
		else {cout<<setiosflags(ios::left)<<setw(16)<<"(19,0)/";}
	}
	else										  //一员运算符的情况
		{
			if(ch=='+')cout<<"(16,0)+";
			else	 if(ch=='-'){cout<<setiosflags(ios::left)<<setw(16)<<"(17,0)-";}
			else	if(ch=='*'){cout<<setiosflags(ios::left)<<setw(16)<<"(16,0)*";}
			else	if(ch=='~'){cout<<setiosflags(ios::left)<<setw(16)<<"(20,0)~";}
			else	if(ch=='^'){cout<<setiosflags(ios::left)<<setw(16)<<"(21,0)^";}
			else	if(ch=='&'){cout<<setiosflags(ios::left)<<setw(16)<<"(22,0)&";}
			else	if(ch==';'){cout<<setiosflags(ios::left)<<setw(16)<<"(30,0);";}
			else	if(ch=='.'){cout<<setiosflags(ios::left)<<setw(16)<<"(31,0).";}
			else	if(ch==','){cout<<setiosflags(ios::left)<<setw(16)<<"(32,0),";}
			else	if(ch=='('){cout<<setiosflags(ios::left)<<setw(16)<<"(33,0)(";}
			else	if(ch==')'){cout<<setiosflags(ios::left)<<setw(16)<<"(34,0))";}
			else {cout<<setiosflags(ios::left)<<"*err("<<++err<<")*    ";}
			i++;ChangeLine();
		}
	}
}



void main()								//主函数
{
	fstream file;
	char buf[MAX];
	InitList_Sq (SqList);				
	file.open("f:\\yang.txt",ios::nocreate|ios::in);
	cout<<"二元式序列:"<<"  (class.value)"<<endl;
	while(!file.eof())
	{	
		file.getline(buf,MAX);			//读取一行句子
		process(buf);					//处理一行句子
	}
	cout<<endl<<"标识符表:"<<endl;cout<<"序列"<<"\t\t"<<"名字 "<<"\t\t"<<"地址 "<<endl;
	for(int temp1=0;temp1<cu;temp1++)
	{
		static int j;					//用于标识地址
		if(strlen(SqList.BL[temp1].id)==8)//对齐作用
			cout<<temp1+1<<"\t\t"<<SqList.BL[temp1].id<<"\t"<<"(1,"<<++j<<")"<<endl;
		else
			cout<<temp1+1<<"\t\t"<<SqList.BL[temp1].id<<"\t\t"<<"(1,"<<++j<<")"<<endl;
	}
	file.close();
}
	

⌨️ 快捷键说明

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