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

📄 condition_sentence.cpp

📁 条件语句的语法分析及语义分析程序设计 利用 LL(1)法完成对语句 IF 〈布尔表达式〉 THEN 〈赋值语句〉 ELSE 〈赋值语句〉;的语法分析及语义分析。中间代码选用四元式表示。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		 falseadd=quad_len+1;
		 AD_ADDRESS(quad_len,JL,a,b,trueadd);
		 AD_ADDRESS(quad_len,JUMP,0,0,falseadd);
		}
	 }
		else
             ERROR("E(id/num)");
	}
	else
		ERROR("E(greater/less)");	
}

//分析语句
void sentence()
{   char rtn;
    char c;	
	if(!nexttoken())
	    ERROR("S(0)");
	if(cur.type==$id)
	{   	  
		c=cur.ch;
		if(!nexttoken())
		 ERROR("S(0)");
		if(cur.type!=$equal)
			ERROR("S(equal)");
		push();
		one=0;
		rtn=LLE1();                                 //                                           
		AD_RESULT(quad_len,equal,rtn,'-',c);
		nexttoken();
		while(cur.type==$id)
		{
		c=cur.ch;
		if(!nexttoken())
		 ERROR("S(0)");
		if(cur.type!=$equal)
			ERROR("S(equal)");
		push();
		one=0;
		rtn=LLE1();                                   //                                   
		AD_RESULT(quad_len,equal,rtn,'-',c);
		nexttoken();
		}
	}
	
}

//LL(1)文法分析
char LLE1()
{
    right=1;                     //开关项为1
	flag=0;
	char t;
	base=(struct Lchar *)malloc(sizeof(Lchar));   //初始化堆栈
	base->next=NULL;
	base->char_ch='#';
	temp=(struct Lchar *)malloc(sizeof(Lchar));
	temp->next=base;
	temp->char_ch='E';
	top=temp;                 //初始化堆栈
    t=dosome();  //开始识别
	if(right)    //如果开关项为1
		cout<<"OK!"<<endl;
	else
		cout<<"Error!"<<endl;
    return t;

}

//入栈函数
void pushs(char pchar)   
{
	temp=(struct Lchar *)malloc(sizeof(Lchar));
	temp->char_ch=pchar;
	temp->next=top;
	top=temp;
}

//出栈函数
void pop(void)  
{
	curtocmp=top->char_ch;
	if(top->char_ch!='#')
		top=top->next;
}

 //根据数组下标计算的值产生式入栈
void doforpush(int t)  
{
	switch(t)
	{
		case 0:pushs('A');pushs('T');break;
		case 5:pushs('A');pushs('T');break;
		case 11:pushs('A');pushs('T');pushs('+');break;
		case 12:pushs('A');pushs('T');pushs('-');break;
		case 20:pushs('B');pushs('F');break;
		case 25:pushs('B');pushs('F');break;
		case 33:pushs('B');pushs('F');pushs('*');break;
		case 34:pushs('B');pushs('F');pushs('/');break;
		case 40:pushs('i');break;
		case 45:pushs(')');pushs('E');pushs('(');
	}
}

//根据curchar,curtocmp转为数字以判断是否有产生式
void changchartoint()  
{
	switch(curtocmp)
	{
		case 'A':i=1;break;
		case 'B':i=3;break;
		case 'E':i=0;break;
		case 'T':i=2;break;
		case 'F':i=4;
	}
	switch(curchar)
	{
		case 'i':j=0;break;
		case '+':j=1;break;
		case '-':j=2;break;
		case '*':j=3;break;
		case '/':j=4;break;
		case '(':j=5;break;
		case ')':j=6;break;
		case '#':j=7;
	}
}

//算法函数
char dosome(void)  
{   
	int t,a=0;
	char bian1,bian2;
    OpKind opa;
	char c='$';
		next();
	for(;;)
	{
		pop();	
		if(cur.type!=$id && cur.type!=$num)
		curchar=cur.ch;
		else
		curchar='i';
		cout<<endl<<curchar<<"    "<<curtocmp<<endl;		
		if(curtocmp=='#' && curchar=='#')
			break;
		if(curtocmp=='A' || curtocmp=='B' || curtocmp=='E'
		   || curtocmp=='T' || curtocmp=='F')   //当前字符为非终结符
                                                   
		{
			if(curtocmp!='#')//当前比较字符不为'#'
			{
				changchartoint();
				if(j==0)
				{   a++;
					flag++;
			    	if(flag==1)
					{   if(c=='$')
					    bian1=cur.ch;
					    else
						bian1=c;
						
			            
					}
		        	else if(flag==3)
					{
			        	bian2=cur.ch;
			        	flag=1;
                        c=newchar();
				        AD_RESULT(quad_len,opa,bian1,bian2,c);//产生四元式
						
					}
				}
				else 
				{
					switch(j)
					{
					    case 1:opa=add;flag++;break;
				    	case 2:opa=sub;flag++;break;
				    	case 3:opa=mul;flag++;break;
				    	case 4:opa=div;flag++;
					}
					
				}
				if(table[i][j])             //有产生式
				{
					t=10*i+j;               //计算产生式在数组中的位置
					doforpush(t);
					continue;
				}
				else                      //没有产生式
				{
					right=0;                //出错
					break;
				}
			}
			else                           //当前比较字符为'#'
				if(curtocmp!=curchar)
				{
					right=0;               //出错
					break;
				}
				else
					break;               //正确
		}
		else                             //当前字符为终结符
			if(curtocmp!=curchar)
			{
				right=0;                //出错
				break;
			}
			else
			{
				next();                  //读取下一个字符
				continue;
			}
	}
	if(a>1)
        return c;
	else
		return bian1;
}

//产生数值语句的四元式
void AD_RESULT(int nlabel,OpKind nop,char npar1,char npar2, char nresult)
{quad[quad_len].label=nlabel;
 quad[quad_len].op=nop; 
 quad[quad_len].par1=npar1;
 quad[quad_len].par2=npar2; 
 quad[quad_len].result=nresult; 
 quad_len++; 
}

//产生跳转地址的四元式
void AD_ADDRESS(int nlabel,OpKind nop,char npar1,char npar2,int naddress)
 {	quad[quad_len].label=nlabel; 
	quad[quad_len].op=nop;
	quad[quad_len].par1=npar1;
	quad[quad_len].par2=npar2; 
	quad[quad_len].address=naddress;
	quad_len++; 
}

//回填出口
void backpath(int nlabel,int addr)
{
	quad[nlabel].address=addr;
}

//错误处理
void ERROR(char str[20])
{   label++;
	cout<<endl;
	cout<<"error!  "<<str<<endl;
}

//输出单词表
void print()
{ 
	for(token_index=0;token_index<total_len;token_index++)
	{   if(token_index%4==0)
	        cout<<endl;
		if(tokentable[token_index].type==$IF)
			cout<<setw(10)<<"IF";
		if(tokentable[token_index].type==$ELSE)
			cout<<setw(10)<<"ELSE";
		if(tokentable[token_index].type==$THEN)
			cout<<setw(10)<<"THEN";
		if(tokentable[token_index].type==$id)
			cout<<setw(10)<<tokentable[token_index].ch;
		if(tokentable[token_index].type==$num)
			cout<<setw(10)<<tokentable[token_index].ch;
		if(tokentable[token_index].type==$equal)
			cout<<setw(10)<<'=';
		if(tokentable[token_index].type==$greater)
			cout<<setw(10)<<'>';
		if(tokentable[token_index].type==$less)
			cout<<setw(10)<<'<';
        if(tokentable[token_index].type==$add)
			cout<<setw(10)<<'+';
		if(tokentable[token_index].type==$sub)
			cout<<setw(10)<<'-';
		if(tokentable[token_index].type==$mul)
			cout<<setw(10)<<'*';
		if(tokentable[token_index].type==$div)
			cout<<setw(10)<<'/';
		if(tokentable[token_index].type==$fenhao)
			cout<<setw(10)<<';';
		if(tokentable[token_index].type==$left_paren)
			cout<<setw(10)<<'(';
		if(tokentable[token_index].type==$right_paren)
			cout<<setw(10)<<')';		
	}
	token_index=0;
}

//输出四元式
void printQuad()
{
	for(int i=0;i<quad_len;i++)
	{
		if(quad[i].label>-1)
			cout<<"L"<<quad[i].label<<":";
		else cout<<endl;
		if(quad[i].op==JG)
		{
			cout<<"J>,"<<quad[i].par1<<","<<quad[i].par2<<",L"<<quad[i].address<<endl;
		}
		else if(quad[i].op==JL)
		{
			cout<<"J<,"<<quad[i].par1<<","<<quad[i].par2<<",L"<<quad[i].address<<endl;
		}
		else if(quad[i].op==JUMP)
		{
			cout<<"J ,"<<"-,-,L"<<quad[i].address<<endl;
		}
		else if(quad[i].op==equal)
		{   
			if(quad[i-1].result==quad[i].par1)
				cout<<"= ,"<<"T"<<quad[i].par1<<",-,"<<quad[i].result<<endl;
			else
			cout<<"= ,"<<quad[i].par1<<",-,"<<quad[i].result<<endl;
		}
		else if(quad[i].op==END)
		{
			cout<<"-,-,-,-"<<endl;
		}
		else if(quad[i].op==add)
		{  if(quad[i].result>='0' && quad[i].result<='9')
            cout<<"+ ,"<<quad[i].par1<<","<<quad[i].par2<<","<<"T"<<quad[i].result<<endl;
		   else
			   cout<<"+ ,"<<quad[i].par1<<","<<quad[i].par2<<","<<quad[i].result<<endl;
		}
		else if(quad[i].op==sub)
		{  if(quad[i].result>='0' && quad[i].result<='9')
            cout<<"- ,"<<quad[i].par1<<","<<quad[i].par2<<","<<"T"<<quad[i].result<<endl;
		   else
            cout<<"- ,"<<quad[i].par1<<","<<quad[i].par2<<","<<quad[i].result<<endl;
		}
		else if(quad[i].op==div)
		{    
			if(quad[i].result>='0' && quad[i].result<='9')
            cout<<"/ ,"<<quad[i].par1<<","<<quad[i].par2<<","<<"T"<<quad[i].result<<endl;
			else
            cout<<"/ ,"<<quad[i].par1<<","<<quad[i].par2<<","<<quad[i].result<<endl;
		}
		else if(quad[i].op==mul)
		{   if(quad[i].result>='0' && quad[i].result<='9')
            cout<<"* ,"<<quad[i].par1<<","<<quad[i].par2<<","<<"T"<<quad[i].result<<endl;
		    else
            cout<<"* ,"<<quad[i].par1<<","<<quad[i].par2<<","<<quad[i].result<<endl;
		}
	}
}

⌨️ 快捷键说明

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