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

📄 jun.cpp

📁 这是个编译原理的课程设计
💻 CPP
字号:
#include <iostream>
using namespace std;
#include <vector>
inline bool __isdigital(char value)
{
	return value<='9'&&value>='0';
}
inline bool __isalpha(char value)
{
	return (value>='a'&&value<='z')||(value>='A'&&value<='Z');
}
struct oitem
{
	char VN;
	char value[30];
	oitem(char lhs,char *rhs)
	{
		memset(value,0,30);
		VN=lhs;
		if(rhs)
			strcpy(value,rhs);
	}
};
bool __islegalopr(char opr)
{
	char legal[]="<=>";
	for(int i=0;i<strlen(legal);i++)
	{
		if(opr==legal[i])
			return true;
	}
	return false;
}

int newlabel=100;
vector<oitem> midtable;
oitem *git,*assit;
void print_otable()
{
	oitem *it=midtable.begin();
	for(;it!=midtable.end();it++)
	{
		cout<<it->VN<<' '<<it->value;
	}
}
char input[1024];
void bool_induce();
void do_induce();
void assign_induce();
void do_induce()
{
	newlabel=100;
	char label[10];
	memset(label,0,3);
	itoa(newlabel,label,10);
	strcpy(midtable.begin()->value,label);
	assign_induce();
	bool_induce();
}
void assign_induce()
{
	if(assit->VN!='i')
	{
		cout<<"assiging  sentence error"<<endl;
		int m;
		cin>>m;
		exit(0);
	}
	while(assit>midtable.begin()+2)
	{
		if((assit-1)->VN!='='&&(assit-2)->VN!='i')
		{
			cout<<"assiging sentence error"<<endl;
			int m;
			cin>>m;
			exit(0);
		}
		assit-=2;
		cout<<newlabel++<<':'<<'\t'<<'='<<'\t'<<(assit+2)->value<<'\t'<<'-'<<'\t'<<assit->value<<endl;
	}
	return;
}
void bool_induce()
{
	int m;
	if(git==midtable.end())
	{
		cout<<"lack condition sentences"<<endl;
		cin>>m;
	}
	else if((git+1)->VN!='<'&&(git+1)->VN!='>')
	{
		cout<<"lack condition sentences"<<endl;
		cin>>m;
	}
	if((git+2)->VN=='=')
		cout<<newlabel++<<':'<<'\t'<<'j'<<(git+1)->VN<<'='<<'\t'<<git->value<<'\t'<<(git+3)->value<<'\t'<<midtable.begin()->value<<endl;
	else
		cout<<newlabel++<<':'<<'\t'<<'j'<<(git+1)->VN<<'\t'<<git->value<<'\t'<<(git+2)->value<<'\t'<<midtable.begin()->value<<endl;
	cout<<newlabel++<<':'<<'\t';
	cout<<'j'<<'\t'<<'-'<<'\t'<<'-'<<'\t'<<newlabel++;
}
int main()
{
	memset(input,0,1024);
	gets(input);
	char temp;
	int firstindex=0;
	int nextindex=0;
	char tmp[30];
	for(;nextindex<strlen(input);nextindex++)
	{
		temp=input[nextindex];
		if(__isdigital(temp)==false&&__isalpha(temp)==false)
		{
			if(firstindex==nextindex)
			{
				if(temp!=' '&&temp!='#')
				{
					if(__islegalopr(temp))
						midtable.push_back(oitem(temp,""));
					else 
					{
						cout<<"error express"<<endl;
						exit(0);
					}
				}
				if(temp=='#')
				{
					break;
				}
				firstindex++;
				continue;
			}
			memset(tmp,0,30);
			memcpy(tmp,input+firstindex,nextindex-firstindex);
			midtable.push_back(oitem('i',tmp));
			if(temp=='#')
				break;
			else if(__islegalopr(temp))
				midtable.push_back(oitem(temp,""));
			else if(temp!=' ')
			{
				cout<<"error"<<endl;
				exit(0);
			}
			firstindex=nextindex+1;
			
		}
		else if(__isalpha(temp))
		{
			if(firstindex!=nextindex&&!__isalpha(input[firstindex]))
			{
				cout<<"error express"<<endl;
				return 1;
			}
		}
	}
	if(midtable.empty())
		return 0;
	if(strcmp(midtable[0].value,"do")!=0)
	{
		cout<<"express must start with do"<<endl;
		cin>>temp;
		exit(0);
	}
	midtable[0].VN='$';
	oitem	*it=midtable.begin();
	for(;it!=midtable.end();it++)
	{
		if(strcmp(it->value,"while")==0)
		{
			git=it;
			git++;
			assit=it;
			assit--;
			it->VN='@';
			break;
		}
	}
	if(it==midtable.end())
	{
		cout<<"lack while subsentence"<<endl;
		cin>>temp;
		exit(0);
	}
	do_induce();
	cin>>temp;
	return ;
}

⌨️ 快捷键说明

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