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

📄 制导翻译.cpp

📁 这是一个制导翻译的源代码
💻 CPP
字号:
#include "function.h"
const int maxsize=100;
void  main()
{
	char input[maxsize],a[maxsize/10];
	  stack1 snum,sop,svar,s;
	    stack2  sobj;
		  int len,pos=0,length,type,i,j,flag,k,num=0,outs;
		   node ntemp;
		   cout<<"请输入一个算术表达式!平方为符号'^'!"<<endl;
		     cin>>input;
			  out(80,'~');
			  length=int(strlen(input));
			   input[length]='#';
			   length++;
			   input[length]='\0';
			   ntemp.namelen=1;
			   ntemp.name[0]='#';
			   ntemp.name[1]='\0';
			   ntemp.value=-1;
			   ntemp.encode=0;
			   s.push(ntemp);
			   while(pos<length)
			   {
				  type=getword(input,a,len,pos);
				   ntemp.namelen=len;
				    ntemp.encode=type;
					 for(i=0;i<len;i++)
						ntemp.name[i]=a[i];
					  ntemp.name[len]='\0';
					  flag=1;
				   if(type==1)//读取的单词为数字
				   { 
						int sum=0;
						 for(i=0;i<len;i++)
						 {
							 sum*=10;
							  sum+=a[i]-'0';
						 }
						 ntemp.value=sum;
						 int temp=snum.search(a,len,flag);
						 if(temp==-1&&flag==0)
						 snum.push(ntemp);
				   }
				   else
					   if(type==0)//读取的单词为操作符
					   {
							ntemp.value=-1;
							int temp=sop.search(a,len,flag);
						     if(temp==-1&&flag==0)
							   sop.push(ntemp);
					   }
					   else
						   if(type==2)//读取的为一个变量
						   {
							   cout<<"警告!读入了未初始化的变量:"<<a<<",默认值是:-1"<<endl;
							   ntemp.value=-1;
							   int temp=svar.search(a,len,flag);
						         if(temp!=-1||temp==-1&&flag==1)
								 {
									 cout<<"变量重复定义!"<<endl;
									  exit(0);
								 }
							       svar.push(ntemp);
						   }
						   else
							   if(type==5)
							   {
								   cout<<"输入有错误,在第 "<<pos<<" 个字符:"<<input[pos-1]<<endl;
								    exit(0);
							   }
					k=s.getsize()-1;
					if(nodeisvt(s.peek(k)))
						j=k;
					  else
						  j=k-1;
					  while(chisvt(a)&&getrank(s.peek(j).name,a)==1)
					  {
						  int h=j,low=j-1;
						   if(!nodeisvt(s.peek(low)))
							   low--;
						    while(getrank(s.peek(low).name,s.peek(h).name)!=-1)
							{
								h=low;
								 low--;
								  if(!nodeisvt(s.peek(low)))
									  low--;
							}
							 h=s.getsize()-1;
							  low++;
							   int lens=h-low+1;
							    node ch[4];
							    for(int p=0;p<lens;p++)
								  ch[lens-1-p]=s.pop();
								  if(lens>0)
								  {
									outs=s.peekall();
									 if(outs<20)
										 out(20-outs,' ');
								     cout<<"弹出:";
								       for(p=0;p<lens;p++)
										 cout<<ch[p].name;
									      cout<<endl;
								  }
								  node c=guiyue(ch,lens,snum,svar,s,num);
									 outs=s.peekall();
									 if(outs<20)
										 out(20-outs,' ');
								     cout<<"压入:"<<c.name<<endl;
								    j=s.getsize()-1;
								     if(!nodeisvt(s.peek(j)))
										j--;
					  }
					  if(chisvt(a)&&getrank(s.peek(j).name,a)==2)
					  {
				         cout<<"你的输入有错误,错误为第 "<<s.getsize()-1<<"个字符处 :"<<a<<endl;
				           exit(0);
					  }
					   else
					   {   
						   s.push(ntemp);
						    outs=s.peekall();
							 if(outs<20)
								out(20-outs,' ');
							 cout<<"进栈:"<<ntemp.name<<endl;
					   }
			   }
			  out(80,'-');cout<<endl;
			   cout<<"下面是结果:"<<endl;
                 cout<<input<<'\b'<<"="<<s.peek(1).value<<endl;
				  out(80,'-');cout<<endl;
				   cout<<"下面是常数表:"<<endl;
				    out(60,'*');cout<<endl;
	               for(i=0;i<snum.getsize();i++)
	                	cout<<snum.peek(i).name<<"------------> "<<snum.peek(i).value<<endl;
				        out(60,'*');cout<<endl<<endl;
	                      cout<<"下面是变量表:"<<endl; 
				            out(60,'^');cout<<endl;
						     for(i=0;i<svar.getsize();i++)
								 cout<<svar.peek(i).name<<"------------> "<<svar.peek(i).value<<endl;
							          out(60,'^');cout<<endl;
 cin>>i;
}

⌨️ 快捷键说明

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