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

📄 词法分析.cpp

📁 八、 设计SAMPLE语言的语法、语义分析器
💻 CPP
字号:
#include"头文件.h"

extern bianYi parse;            //词法分析
extern item sign;            //


void valuetable::add(valuetype temp){
	vt[vttop++]=temp;
}
valuetable::valuetable(){
	vttop=0;
}
void valuetable::print(){
	for(int i=0;i<vttop;i++)
		cout<<parse.list2.list[vt[i].location]<<"  "<<vt[i].type<<endl;
}
int valuetable::vt_findlocation(int l){
	for(int i=0;i<vttop;i++){
		if(vt[i].location==l)return i;
	}
	return -1;
}
valuetype::valuetype(int x,int y){
	type=x;
	location=y;
}
valuetype::valuetype(){};
valuetype::valuetype(const valuetype&temp){
    type=temp.type;
	location=temp.location;
}  
jieguolist::jieguolist(){w=0;};
void jieguolist::add(int hao,int id,int hangi){
		jieguo[w].x=hao;
		jieguo[w].y=id;
		hang[w]=hangi;
		w++;
	}
changbiaolist::changbiaolist(){
		idend=1;
		for(int j=0;j<max2;j++){
			list[j]=new char[max3];
		}
	}
void changbiaolist::add(char hao[max3]){
		strcpy(list[idend++],hao);
}

biaomalist::biaomalist(){
		for(int j=0;j<max;j++){
			list[j]=new char[max0];
		}
		strcpy(list[1],"and");
		strcpy(list[2],"array");
		strcpy(list[3],"begin");
		strcpy(list[4],"bool");
		strcpy(list[5],"call");
		strcpy(list[6],"case");
        strcpy(list[7],"char");
		strcpy(list[8],"constant");
		strcpy(list[9],"dim");
		strcpy(list[10],"do");
		strcpy(list[11],"else");
		strcpy(list[12],"end");
		strcpy(list[13],"false");
        strcpy(list[14],"for");
	    strcpy(list[15],"if");
		strcpy(list[16],"input");
        strcpy(list[17],"integer");
		strcpy(list[18],"not");
        strcpy(list[19],"of");
        strcpy(list[20],"or");
        strcpy(list[21],"output");
        strcpy(list[22],"procedure");
		strcpy(list[23],"program");
		strcpy(list[24],"read");
        strcpy(list[25],"real");
        strcpy(list[26],"repeat");
        strcpy(list[27],"set");
        strcpy(list[28],"stop");
        strcpy(list[29],"then");
        strcpy(list[30],"to");
        strcpy(list[31],"true");
        strcpy(list[32],"until");
        strcpy(list[33],"var");
        strcpy(list[34],"while");
        strcpy(list[35],"write");
		strcpy(list[36],"标识符");
        strcpy(list[37],"整数");
        strcpy(list[38],"字符常数");
        strcpy(list[39],"(");
		strcpy(list[40],")");
        strcpy(list[41],"*");
        strcpy(list[42],"*/");
        strcpy(list[43],"+");
        strcpy(list[44],",");
        strcpy(list[45],"-");
        strcpy(list[46],".");
        strcpy(list[47],"..");
        strcpy(list[48],"/");
        strcpy(list[49],"/*");
        strcpy(list[50],":");
        strcpy(list[51],":=");
        strcpy(list[52],";");
        strcpy(list[53],"<");
        strcpy(list[54],"<=");
        strcpy(list[55],"<>");
        strcpy(list[56],"=");
        strcpy(list[57],">");
        strcpy(list[58],">=");
        strcpy(list[59],"[");
        strcpy(list[60],"]");
}
void bianYi::createbianYi(char*fileName){
			inf.open(fileName,ios::in);
			i=1;
}
bianYi::bianYi(){};
bianYi::bianYi(char*fileName){
			inf.open(fileName,ios::in);
			i=1;
}
int bianYi::looklist1(int begin,int end,char fuhao[10]){////处理关键字的加载
			for(int j=begin;j<=end;j++){
				if(strcmp(list1.list[j],fuhao)==0){
				//	cout<<list1.list[j]<<endl;
					list3.add(j,0,i);
					return 1;
				}
			}
			return 0;
		}
int bianYi::looklist2(char fuhao[10]){////////////处理标式附的加载
			for(int j=1;j<=list2.idend-1;j++){
				///查找常量保留字表若找到用它的ID加载结果表,否则创建新的ID加载结果表
                 
				if(strcmp(list2.list[j],fuhao)==0){
					list3.add(36,j,i);
					return 1;
				}
			}
			list2.add(fuhao);
			list3.add(36,list2.idend-1,i);
			return 0;
		}
					
int bianYi::looklist22(char fuhao[max3]){////////////处理字符串的加载
			for(int j=1;j<=list2.idend-1;j++){
				///查找常量保留字表若找到用它的ID加载结果表,否则创建新的ID加载结果表
                 
				if(strcmp(list2.list[j],fuhao)==0){
					list3.add(38,j,i);
					return 1;
				}
			}
			list2.add(fuhao);
			list3.add(38,list2.idend-1,i);
			return 0;
		}
	
char bianYi::getCh(){
			char c;
			if(inf.get(c)){
				if(c=='\n')i++;
					return c;	
			}
			else {
				i++;
				return NULL;
			}
		}
bianYi::~bianYi(){
			inf.close();
		}
void bianYi::ciFa(){
			char c;
	        int j;
			c=getCh();
			while(c!=NULL){
				while(c==' '||c=='\n'||c=='\t')c=getCh();
				if((c>=65&&c<=90)||(c>=97&&c<=122))
				{
					char biaoShi[10];
					
					biaoShi[0]=c;
					int state=0;
					for(j=1;true;j++){//////////////////////>10问题,字符串/0
						c=getCh();
						if((c>=65&&c<=90)||(c>=97&&c<=122))biaoShi[j]=c;
						else if(c>=48&&c<=57){
							biaoShi[j]=c;
							state=1;
						}
						else break;
					}
					biaoShi[j]='\0';
				//	cout<<biaoShi<<endl;
					if(state==0){
						if(looklist1(1,35,biaoShi)==0){
							looklist2(biaoShi);
						}
					}
					else looklist2(biaoShi);

				}
				
				else if(c>=48&&c<=57){
			
					int n=c-'0';
			
					for(c=getCh();c>=48&&c<=57;c=getCh())
						n=n*10+c-'0';
                    list3.add(37,n,i);

				}
				/////////////////''处理
				else if(c=='\''){
					char temp[max4];
					c=getCh();
				    for(j=0;c!='\''&&c!='\n';j++){
						temp[j]=c;
						c=getCh();
					}
					if(c=='\n')cout<<"error:第"<<i<<"行出错,找不到'"<<endl;
					temp[j]='\0';
					c=getCh();
					
                    looklist22(temp);
				}
				
				else {
					char hao[3];
					hao[0]=c;
					hao[1]='\0';
					//////////////////////运算符
					if(looklist1(39,60,hao)){
						c=getCh();
                        hao[1]=c;
						hao[2]='\0';
						if(strcmp(hao,"/*")==0){
							list3.w--;
							 for(j=0;c!='\n'&&c!=NULL;j++){
					
						        c=getCh();
								if(c=='*'){
								//	hao[0]=c;
									c=getCh();
									if(c=='/')
										break;
								}
							 }

					         if(c=='\n'||c==NULL)cout<<"error:第"<<i<<"行出错,找不到*/ "<<endl;/////////////////////////////////////
							 c=getCh();
					
						}
						else if(looklist1(39,60,hao))
						{
							c=getCh();
							list3.w--;
							list3.w--;
							looklist1(39,60,hao);
						}
					}
					else {cout<<"error:第"<<i<<"行出错,有字符无法识别"<<endl;c=getCh();}
				}
			}
}

		

⌨️ 快捷键说明

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