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

📄 ifelse.cpp

📁 该程序能够对if-else进行语法指导的翻译
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	else if(p->type==2) return 7;
	else
	{
		for(i=0;i<23;i++)
		{			
			t=mark[i];
			if(strcmp(s,t)==0)
				break;
		}
	    return i;
	}
	
}
char* copy(Node* p,Node* top)//复制字符串
{
	char *str;
	Node* t;
	t=p;
	str=t->data;
	t++;
	while(t!=top+1)
	{
		strcat(str,t->data);
		t++;
	}
	return str;
}
char *findG(char *str)
{
	int i=0;
	char *left;
	while(strcmp(str,gene[i].right))
	{
		if(i==16)
		{
			cout<<"没有可用产生式"<<endl;
			exit(0);
		}
		i++;
	}
     left=gene[i].left;
	 return left;
}
int grammar(Node* s)
{
	//int length;
	int i,j;//行列
	//length=getLength(s);//链表长度
	Node stack[100];//栈
	Node* base=stack;
	Node* top=stack;
	Node* p,*q;
	char *str;
	initMatrix();
	init_gene();
	strcpy(top->data,"#");
	top->type=-1;
	top++;
    if(s->type==1)
	{
		strcpy(top->data,"i");
		//top->data="i";
		top->type=s->type;
	}
	else if(s->type==2)
	{
		strcpy(top->data,"n");
		//top->data="n";
		top->type=s->type;
	}
	else
	{
		strcpy(top->data,s->data);
		//top->data=s->data;
	    top->type=s->type;
	}
	s=s->next;
	//top++;
	while(strcmp(s->data,"#"))
	{
		i=location(top);
		j=location(s);
		while(Matrix[i][j]!='>')
		{
			top++;
			if(s->type==1)
			{
				strcpy(top->data,"i");
				//top->data="i";
				top->type=s->type;
			}
			else if(s->type==2)
			{
				strcpy(top->data,"n");
				//top->data="n";
				top->type=s->type;
			}
			else
			{
				strcpy(top->data,s->data);
				//top->data=s->data;
			    top->type=s->type;
			}
			s=s->next;
			i=j;
			//i=location(top);
		    j=location(s);
		}
        p=top;
		q=p-1;
		i=location(q);
		j=location(p);
		while(Matrix[i][j]!='<')
		{
			p--;
			q=p-1;
			i=location(q);
		    j=location(p);
		}
        str=copy(p,top);
		top=p;
		top->type=-1;
        str=findG(str);
		strcpy(top->data,str);
		
	}
     while(!strcmp(s->data,"#")&&top!=base+1)
	 {
		p=top;
		q=p-1;
		i=location(q);
		j=location(p);
		while(Matrix[i][j]!='<')
		{
			p--;
			q=p-1;
			i=location(q);
		    j=location(p);
		}
        str=copy(p,top);
		top=p;
		top->type=-1;
        str=findG(str);
		strcpy(top->data,str);
	 }
	if(top==base+1)
	{
		if(!strcmp(top->data,"S"))
		{
		    cout<<"语法分析正确"<<endl;
		    return 1;
		}
    	else 
		{
		    cout<<"语法分析错误"<<endl;
		   return 0;
		}
	}
	else
	{
		cout<<"语法分析错误"<<endl;
		   return 0;
	}
}
//--------------------------语法分析结束--------------------------------





//-------------------------------四元式输出---------------------------------------------------
int m=0;//记录行号
int t=0;//保存角标
void print_result(Node* s)//输出四元式
{
	//int jmp=0;
	//int i;
	Node *E1,*E2,*E3;
    Node *E1_r,*E2_r,*E3_r;
	//string I,M;
	s=s->next;
	E1=s;//找到每个表达式的首尾
	E1_r=findE(E1); //then 
	E2=E1_r->next;
    E2_r=findE(E2);//else
    E3=E2_r->next;
    E3_r=findE_1(E3);//#
	s=E1->next->next;
	if(s->next==E1_r)
    {
		cout<<setiosflags(ios::left)<<setw(4)<<m<<"if ";
			printE(E1,E1_r);
			cout<<" goto 2"<<endl;
			m++;
	}
	else
	{
		print_evalue(s,E1_r);
        cout<<setiosflags(ios::left)<<setw(4)<<m<<E1->data<<E1->next->data
			<<'T'<<--t<<" goto "<<m+2<<endl;
		t++;
			m++;
	}
	cout<<setiosflags(ios::left)<<setw(4)<<m<<"goto "<<m+count(E2,E2_r)+2<<endl;
			m++;
    s=E2->next->next;
	if(s->next==E2_r)
	{
        cout<<setiosflags(ios::left)<<setw(4)<<m;
			printE(E2,E2_r);
			cout<<endl;
			m++;
	}
    else
	{
		print_evalue(s,E2_r);
        cout<<setiosflags(ios::left)<<setw(4)<<m<<E2->data<<'='<<'T'<<--t<<endl;
			t++;
			m++;
	}
	cout<<setiosflags(ios::left)<<setw(4)<<m<<"goto "<<m+count(E3,E3_r)+1<<endl;
	m++;
    s=E3->next->next;
    if(s->next==E3_r)
	{
        cout<<setiosflags(ios::left)<<setw(4)<<m;
			printE(E3,E3_r);
			cout<<endl;
			m++;
	}
    else
	{
		print_evalue(s,E3_r);
        cout<<setiosflags(ios::left)<<setw(4)<<m<<E3->data<<'='<<'T'<<--t<<endl;
			t++;
			m++;
	}
	cout<<setiosflags(ios::left)<<setw(4)<<m<<endl;
}
Node* findE(Node* s)//找尾
{
	while(s->type!=3) s=s->next;
	return s;
}
Node* findE_1(Node* s)//找尾
{
	while(strcmp(s->data,"#"))
		s=s->next;
	return s;
}

int count(Node* p,Node* q)//计算赋值表达式的翻译占用几行
{
	int count=0;
	while(p!=q)
	{
		if(p->type==411||p->type==44)
			count++;
		p=p->next;
	}
	return count;
}

void printE(Node* p,Node* q)//打印表达式
{
	while(p!=q)
	{
		cout<<p->data;
		p=p->next;
	}
	
}
void print_evalue(Node* p,Node* q)//分析赋值表达式,输出四元式
{
	//int jmp=0;
	int i=0;//操作符顶
	int n=0;//操作数顶 上面
	char *optr[100],*opnd[100];
	char  l[10],r[10];//保存左右操作数
	char  op[10];//保存操作符 
	//int t=0;//保存T的脚标
	char *T[10]={"T0","T1","T2","T3","T4","T5","T6","T7","T8","T9"};
	optr[0]=";";
	//p=copyE(s);
	//p=p->next;
	while(p!=q||strcmp(optr[i],";"))
	{
		if(wordtypeE(p)=='d') //运算数进栈
		{
			opnd[n]=p->data;
			n++;
			p=p->next;
		}
		else
		{
			if(p==q)
			{
				switch(Precede(optr[i][0],';'))
				{
			 case'<'://栈顶元素优先权低
                i++;
				optr[i]=p->data;
				p=p->next;
				break;
			 case'='://脱括号并接收下一字符
				i--;
                p=p->next;
				break;
			 case'>'://退栈并输出
				n--;
				strcpy(r,opnd[n]);
				n--;
				strcpy(l,opnd[n]);
				strcpy(opnd[n],T[t]);
			    n++;//指向最顶
				strcpy(op,optr[i]);//op=optr[i];
				i--;
				cout<<setiosflags(ios::left)<<setw(4)<<m<<'T'<<t<<'='<<l<<op<<r<<endl;
				m++;
				t++;
				//jmp++;
				break;
				}
			}
			else
			{
			  switch(Precede(optr[i][0],p->data[0]))
			  {
			  case'<'://栈顶元素优先权低
                i++;
				optr[i]=p->data;
				p=p->next;
				break;
			  case'='://脱括号并接收下一字符
				i--;
                p=p->next;
				break;
			  case'>'://退栈并输出
				n--;
				strcpy(r,opnd[n]);
				n--;
				strcpy(l,opnd[n]);
				strcpy(opnd[n],T[t]);
			    n++;//指向最顶
				strcpy(op,optr[i]);//op=optr[i];
				i--;
				cout<<setiosflags(ios::left)<<setw(4)<<m<<'T'<<t<<'='<<l<<op<<r<<endl;
				m++;
				t++;
				//jmp++;
				break;
			  }
			}
		}
	}
}
char wordtypeE(Node* s)      //判断字符的类型
{
    switch(s->type)
	{
	case 1:
	case 2:return 'd';//改n
	case 411:return s->data[0];
	case 412:
		if(!strcmp(s->data,"++")) return 'a';
        if(!strcmp(s->data,"--")) return 'b';
    case 44:return s->data[0];
	case 51:return s->data[0];
	case 53:return s->data[0];
	}
	return '$';
}
char Precede (char op1,char op2)//比较算符优先级
{
	switch(op1)
	{
	   case '+':
			switch(op2)
			{
				case '+':
				case '-':
				case ')':
				case ';':  return '>';
				default:   return '<';
			}
		case '-':
			switch(op2)
			{
				case '+':
				case '-':
				case ')':
				case ';':	return '>';
				default:    return '<';
			}
		case '*':
			switch(op2)
			{
				case '+':
				case '-':
				case ')':
				case '*':
				case '/':
				case ';':	return '>';
				default:	return '<';
			}
		case '/':
			switch(op2)
			{
				case '+':
				case '-':
				case ')':
				case '*':
				case '/':
				case ';': return '>';
				default:  return '<';
			}
		case '(':
			switch(op2)
			{
				case '+':
				case '-':
				case '*':
				case '/':
				case '(':  return '<';
				case ')':  return '=';
				default:   return '0';
			}
		case ')':
			switch(op2)
			{
				case '+':
				case '-':
				case '*':
				case '/':
				case ')':
				case ';': return '>';
				case '(': return '0';
				default: return '0';
			}
		case ';':
			switch(op2)
			{
				case '+':
				case '-':
				case '*':
				case '/':
				case '(':	return '<';
				case ')':	return '0';
				default:	return '=';
			}
	}
	return '0';
}
//----------------------------------程序结束-----------------------------------------------------




⌨️ 快捷键说明

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