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

📄 blockdivide.cpp

📁 中间代码基本块划分(C++)程序源代码+课程设计报告 实现编译原理中代码优化的功能
💻 CPP
字号:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int ch=0,back_ch=0;                       
char c[200],in[10],out[10];              //c[]存放输入的数据,数组in[]/out[]存放入/出口语句序号

void main()
{
	int i=0,j=-1,back_i=0,in_num=0,out_num=0;
	char g[200];
	cout<<"请输入要进行基本块划分的四元式(按回车表示四元式输入完毕):"<<endl;
	
	for(i=0;i<200;i++)
	{g[i]=' ';c[i]=' ';}		          
	gets(g);                              
	for(i=0;i<200;i++)	{c[i]=g[i];}      //将输入的数据备份到c[]	
	//入口条件1													
	in[in_num++]='1';                     //首句为入口语句,将语句序号放入in[]
	

    //入口条件2
	for(i=0;*(g+i)!='~';i++)              //由条件转移语句或无条件转移语句能转到的语句为入口语句
	{
		if(*(g+i)==':')                  
		{
			back_i=i;                     
			for(;*(g+back_i)!=')';back_i--)
			{continue;}
			 in[in_num++]=*(g+back_i-1);  //得到入口语句序号,将其放入in[]
/*出口条件1*/
			 out[out_num++]=(char)((int)*(g+back_i-1)-1);//入口语句的上一句是出口语句,将其序号放入out[]
			 break;
		}
	}
	cout<<"_______________________________"<<endl<<endl;
	cout<<"判定输出语句/输入语句过程(输出语句—>输入语句):"<<endl<<endl;
	for(;j!=0;j++)		
	{cout<<"sentence ("<<out[out_num-1]<<") --> ("<<in[in_num-1]<<")"<<endl;}
	
	//入口条件3
	for(i=0;*(g+i)!='~';i++)                       //紧跟在条件语句后面的语句为入口语句
	{
		if(*(g+i)=='i'&&*(g+i+1)=='f')             //找到条件语句关键字if
		{
			back_i=i;
			for(;*(g+back_i)!='(';back_i++)        //找到条件语句的下一句,即入口语句
			{continue;}
			in[in_num++]=*(g+back_i+1);            //将入口语句序号放入in[]
		}
	}	
	
/*出口条件2*/
	for(i=0;*(g+i)!='~';i++)                       //转移语句为出口语句
	{
		if(*(g+i)=='g'&&*(g+i+1)=='o')             //找到转移语句的关键字goto后,将语句序号放入out[]
		{
			back_i=i;
			for(;*(g+back_i)!=')';back_i--)
			{continue;}
			out[out_num++]=*(g+back_i-1);          
			in[in_num++]=(char)((int)*(g+back_i-1)+1);//其下一句是入口语句,将语句序号放入in[]
			for(;j<1;j++)
			{cout<<"sentence ("<<out[out_num-1]<<") --> ("<<in[in_num-1]<<")"<<endl;}
			for(;*(g+back_i)!='L';back_i++)       //找到转移语句 能够转到的语句序号
			{continue;}
			for(;*(c+ch)!='~';ch++)
			{
				for(;*(c+ch)!='L';ch++)	{continue;}
				if(*(g+back_i+1)==*(c+ch+1)&&back_i!=ch)//根据语句序号找到相应的语句
				{
					back_ch=ch;
					for(;*(c+back_ch)!=')';back_ch--)
					{continue;}
					cout<<"sentence ("<<out[out_num-1]<<") --> ("<<*(c+back_ch-1)<<")"<<endl;
					break;                              //输出转移
				}			
			}
			ch=0;
		}
	}

/*出口条件3*/	
	for(i=0;*(g+i)!='~';i++)                            //停语句为出口语句,找到停语句
	{continue;}
			back_i=i;
			for(;*(g+back_i)!=')';back_i--)
			{continue;}
			out[out_num++]=*(g+back_i-1);               //将语句序号放入out[]
     cout<<"_______________________________"<<endl<<endl;
	 cout<<"划分好的代码块:"<<endl;
	for(i=0;i<4;i++)
	{cout<<"Block[ "<<i+1<<" ]: ("<<in[i]<<") -- ("<<out[i]<<")"<<endl;}//输出各基本块内的语句
}

⌨️ 快捷键说明

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