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

📄 analysis.cpp

📁 简单赋值语句翻译成四元式 (编译原理实验)
💻 CPP
字号:
#include"analysis.h"
#include <iostream>
#include <fstream>
#include <algorithm>

analyse::analyse()
{ 
	begin=0;end=0; text=" "; 
	keys[0]="t0";keys[1]="t1";keys[2]="t2";keys[3]="t3";
	keys[4]="t4";keys[5]="t5";keys[6]="t6";keys[7]="t7";
	keys[8]="t8";keys[9]="t9";keys[10]="t10";keys[11]="t11";
	keys[12]="t12";keys[13]="t13";keys[14]="t14";keys[15]="t15";
}

void analyse::Get_text(){
	string name;
p:  cout<<"输入文件名(含路径): ";
	cin>>name;
	ifstream  file(name.c_str (),ios::in );
	if(!file){
		cerr<<"文件"<<name<<"无法打开!!"<<endl;
		goto p;
	}
	cout<<endl;
	string str=" ";
	while(getline(file,str))
		text+=str;
	file.close ();
}

bool analyse::Is_boundary(string str){
	char boundry[]={',',';','{','}','(',')','\"'};
	for(int i=0;i<7;i++) 
		if(str[0]==boundry[i])
			return true;
	return false;
}

bool analyse::Is_macthsign(string str){
	char sign[7]={'+','-','*','/','=','<','>'};
    for (int i=0;i<7;i++) 
         if(str[0]==sign[i])
             return true;
     return false;
}

void analyse::find_key(){
	string p[]={"char","double","int","long","double","float","for","while","do","break","continue","switch","short","case","return","if"};
	for(int i=0;i<16;i++)
		key.push_back (p[i]);
}

bool analyse::Is_key(string str){
		for(string::size_type i=0;i<key.size ();i++)
		if(!str.compare (key[i]))
			return true;
	return false;
}

string analyse::get_word(){
	string word;
	string str("()!{},; \n+-*/=<>\"");
	end=(int)text.find_first_of(str,begin);
	if(end==-1) return " ";
	if(begin!=end) end--;
	word=text.substr (begin,end-begin+1);  
	return word;
}

void analyse::Get_word(){
	do{
		for( ; ;begin++) {
			if(text[begin]!=' '&&text[begin]!='\n') 
				break;
		}
  	    string word=get_word();
		if(end==-1) break;
		if(word!=" "&&word!="\n") 
			s_word.push_back (word);
		begin=end+1;
	}while(true);
}

void analyse::display( ){
	cout<<" "<<endl;
    cout<<"**********        程序已完成词法分析,分析结果显示如下       ****************\n";
    cout<<"**********    O-运算符  K-关键字  N-常数  B-界符 S-标志符    ****************\n";
    cout<<" "<<endl;
	for(string::size_type i=0;i< str_word.size();i++)
        cout<<"<"<<str_word[i].type <<"  ,  "<<str_word[i].word <<" >"<<endl;
}

void analyse::text_analysis( ){
	team p;
	for(string:: size_type i=0;i<s_word.size ();i++){
         if(s_word[i].size()==1)
         {
             if((s_word[i]==">"||s_word[i]=="<"||s_word[i]=="!"||s_word[i]=="-"||s_word[i]=="+")&&s_word[i+1]=="=")
             {           
				   p.type ="O";
				   p.word =s_word[i]+s_word[i+1];
                   i++;
                   str_word.push_back(p);
                   continue;
             }
             if((s_word[i]=="+"&&s_word[i+1]=="+")||(s_word[i]=="-"&&s_word[i+1]=="-"))
             {
                   p.type ="O";
				   p.word =s_word[i]+s_word[i+1];
                   i++;
                   str_word.push_back(p);
                   continue;
             }
             if(Is_boundary(s_word[i]))
             {
                   p.type ="B";
				   p.word =s_word[i];
                 
                   str_word.push_back(p);
             }
             else if(Is_macthsign(s_word[i]))
             {
                   p.type ="O";
				   p.word =s_word[i];
                 
                   str_word.push_back(p);
             }
             else if(s_word[i][0]<='9'&&s_word[i][0]>='0')
             {
                   p.type ="N";
				   p.word =s_word[i];
                 
                   str_word.push_back(p);
             }
             else 
             {
                   p.type ="S";
				   p.word =s_word[i];
                 
                   str_word.push_back(p);
             }
         }
         else if(s_word[i][0]<='9'&&s_word[i][0]>='0')
         {
              p.type ="N";
			  p.word =s_word[i];
                 
              str_word.push_back(p);
         }
         else if(Is_key(s_word[i]))
         {
              p.type ="K";
			  p.word =s_word[i];
                 
              str_word.push_back(p);
         }
         else
         {
              p.type ="S";
			  p.word =s_word[i];
                 
              str_word.push_back(p);
         }
	}
}
//================================================================================
void analyse::find_Expression(){
	
	string::size_type i,j,index;
	for( i=0;i<str_word.size ();i++)
		if(!str_word[i].word.compare ("=")||!str_word[i].word.compare ("+=") ||!str_word[i].word.compare ("-="))
		{ 
            index=i-1;
			for(j=i;j<str_word.size ();j++)
				if(!str_word[j].word.compare (";"))
				{   
					//for( ;index<j;index++)
					//	expression=expression+s_word[index];					
				    if(str_word[index].type=="S")  ana_Expression(index,j,0);										 
					else  ana_Expression(index,j,-1);

					//cout<<str_word[i].word<<endl;
					i=j+1;
				//	cout<<str_word[index].word<<endl;
				//	cout<<str_word[i].word<<endl;
				//	cout<<str_word[j-1].word<<endl;
					break;
				}
        //    expressions.push_back (expression);
		//	expression=" ";
		}
		//for(string::size_type m=0;m<expressions.size ();m++)
		 //    cout<<expressions[m]<<endl;
}

void analyse::ana_Expression(string::size_type index,string::size_type i,int j){
//	int flag;
	string::size_type m;
	string expression;
	expression=" " ;
	for( m=index;m<i;m++)
		expression=expression+str_word[m].word ;

	if(j==-1) expression=expression+"  ERROR!";
	else if(str_word[index+2].type=="O"&&str_word[index+2].word !="(") 
	{
		expression=expression+"  ERROR!";
		j=-1;
	}
    cout<<"赋值表达式:"<<expression<<endl;
	expressions.push_back (expression);

	node *p,*q,*head;
	head=NULL;
	
	if(j==0)
	{   cout<<"翻译成的四元式为:"<<endl;
	    /*for(m=index;m<i;m++)
		{
			if(str_word[m].type =="O")  
			{   
				if(str_word[m].word =="+"||str_word[m].word =="-") flag=1;
				else if(str_word[m].word =="*"||str_word[m].word =="/") flag=2;
				else if(str_word[m].word =="("||str_word[m].word ==")") flag=3;
				else if(str_word[m].word =="="||str_word[m].word =="-="||str_word[m].word =="+=") flag=0;
				else flag=-1;
			}
		}*/
		for(m=index;m<i;m++)
		{
		    p=new node;
		    p->words=str_word[m].word ;
		    p->next =NULL;
		    p->up =NULL;
		    p->flag =0;
		    if(p->words=="+"||p->words=="-") p->flag =2;
		    else if(p->words=="*"||p->words=="/") p->flag =3;
		    else if(p->words=="("||p->words==")") p->flag =4;
		    else if(p->words=="="||p->words=="-="||p->words=="+=")p->flag =1;
		    if(head==NULL) head=p;
		    else { q->next=p;p->up =q;}
		    q=p;
		}
		q=NULL;int k=0;
		while(head!=NULL)    {Get_first_sign(head,q,k);cout<<endl;}
	}
	//q=NULL;	
}

void analyse::Get_first_sign(node * &head,node * q1,int &k){
    node *p,*q;    //if(q1) cout<<q1->words <<endl;
	do{
	q=NULL;
	for(p=head;p!=NULL;p=p->next){
		
		if(p->flag >0){
			if(q==NULL) q=p;
			else if((p->flag >q->flag || p->words =="(")&&p->words !=")") q=p;
		}
		if(p==q1) break;
	}
//	cout<<q->words<<q->up->words<<" "  <<endl;
 //   cout<<"余飞"<<endl;cout<<q->words <<endl;
	if(q && q->words ==")"){
			q->up ->next = q->next ;
			if(q->next) q->next ->up =q->up ;
			q=NULL ;return;
	}

	if(q->words =="(") {
		q->up ->next =q->next ;
		q->next ->up =q->up ;
		p=q->next ;q=q->next ;
		while(p->words !=")") p=p->next ;
		/*if(p->words ==")"){
			p->up ->next =p->next ;
			   p->next ->up =p->up ;
			p=p->up ;
		}*/
//		cout<<p->words <<endl;
		Get_first_sign(q,NULL,k);
	}
  //  cout<<"余飞"<<endl;
	if(q!=NULL&&(q->flag) >0)  get_result(head,q,k);
	}while(head);
}
	
void analyse::get_result(node * &head,node * &q,int &k){
    four_node four;
    node * q1,* q2;
	if(q->flag ==1){
		if(q->words =="+=" || q->words =="-="){
			four.opt=q->words ;
			four.arg1 =q->up ->words ;
			four.arg2 =q->next ->words ;
			four.result =q->up ->words ;
		}
		else{
			four.opt=":=" ;
			four.arg1 =q->next ->words ;
			four.arg2 ="-" ;
			four.result =q->up ->words ;
		}
		head=NULL;
	}
	else if(q->flag ==2||q->flag ==3){
		four.opt=q->words ;
		four.arg1 =q->up ->words ;
		four.arg2 =q->next ->words ;
		four.result =keys[k] ;
		k=k+1;
	//	cout<<"余飞"<<endl;cout<<q->words <<endl;
		node *temp;temp=new node;
		temp->words =four.result ;
		temp->flag =0;
		q1=q->next ;
		temp->next =q1->next;
        if(q1->next) q1->next->up =temp;
		q2=q->up ;
		temp->up =q2->up;
		q2->up ->next =temp;
		if(q2==head) head=temp;
		q=temp;
//		cout<<q->up->words<<" "<<q->words  <<endl;
	}
	four_node_expr.push_back (four);
	cout<<"<"<<four.opt <<","<<four.arg1<<","<<four.arg2 <<","<<four.result <<">" <<endl;
	
} 

⌨️ 快捷键说明

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