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

📄 消除左递归.cpp

📁 实现编译原理消除左递归的c++程序源代码 实现编译原理消除左递归的c++程序源代码
💻 CPP
字号:
#include<iostream>
#include<fstream>
#include<string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::fstream;
const int size=10;
string gene[size],temp[size];
int main()
{
	int i=0,count=0;
	cout<<"\t\t输入1表示直接输入文法\n\t\t输入2表示从文件输入!\n\t\t输入表示其他退出!"<<endl;
	cin>>i;
	if(i==2)
	{
	  fstream fin("C:\\Documents and Settings\\piao\\桌面\\test1\\s.txt");
	  i=0;
	  while(fin>>gene[i])i++;
	  count=i;
	}
	else if(i==1)
	{
		cout<<"请输入文法的行数:"<<endl;
		cin>>count;
		cout<<"请输入文法:"<<endl;
		for(i=0;i<count;i++)
			cin>>gene[i];
	}
	else
		return 0;
	cout<<"原文法为:"<<endl;
	for(i=0;cout<<gene[i]<<endl,i<3;i++);
	
	int j=0;
	
	size_t start=0, end=0;
	int count2=0;
	
	for(i=0;i<count;i++)	
	{
		
		for(j=0;j<i;j++)
		{
			start=2;
	
			char qj=gene[j][0];
	
			
			//修改每一条满足条件的产生式
			bool rgt=false;
			
			int count1=0;
			
			string tt[size];
			
			size_t s=0;
			
			size_t e=0;
			do
			{
				start++;
				
				if(gene[i][start]==qj)//如果满足pi->qj*;
				{
					
					
					size_t es=gene[i].find_first_of("|",start+1);
					
					if(es==string::npos)
						
						es=gene[i].length();
					
					string te=gene[i].substr(start+1,es-start-1);
					
					
					if(!rgt)
					{
						s=gene[j].find_first_not_of("|",3);
						
						while(s!=string::npos)
						{
							e=gene[j].find_first_of("|",s+1);
							
							if(e==string::npos)
								
								e=gene[j].length();
							
							tt[count1]=gene[j].substr(s,e-s);
							
							count1++;
							
							s=gene[j].find_first_not_of("|",e+1);

						}
						rgt=true;
					}
					int k=0;

					string ttl="\0";

					for(;k<count1-1;k++)
						
						ttl+=tt[k]+te+"|";
					
					ttl+=tt[k]+te;

					//cout<<ttl<<endl;
					
					gene[i].replace(start,es-start,ttl);

					//cout<<gene[i]<<endl;

					//cout<<gene[i]<<endl;
				}
				start=gene[i].find_first_of("|",start+1);
			    
			}while(start!=string::npos);
		}
		//消除直接左递归
		string p1="",p2="";
		size_t sss=3,eee=0;
		char ch=gene[i][0];
		bool rg=false;
		while(sss!=string::npos)
		{
			eee=gene[i].find_first_of("|",sss+1);
			if(eee==string::npos)eee=gene[i].length();
			if(gene[i][sss]==ch)
			{
				rg=true;
				p1+=gene[i].substr(sss+1,eee-sss-1)+ch+"\'|";
			}
			else
			{
				p2+=gene[i].substr(sss,eee-sss)+ch+"\'|";
			}
		    sss=gene[i].find_first_not_of("|",eee+1);
		}
		p2[p2.length()-1]='\0';
		
		if(rg)
		{
           temp[count2]=ch+("\'->"+p1+"#");
		   count2++;
		   gene[i].replace(3,gene[i].length()-3,p2);
		}
	}
	cout<<"消除递归后的文法为:"<<endl;
	for(i=0;cout<<gene[i]<<endl,i<count-1;i++);
	for(i=0;cout<<temp[i]<<endl,i<count2-1;i++);

		return 0;
}

⌨️ 快捷键说明

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