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

📄 ci.txt

📁 理解编译程序的构造原理
💻 TXT
📖 第 1 页 / 共 2 页
字号:
				 error(30);	//数太大
				 num=0;
			 }     
			 gen(lit,0,num);
			 getsym();    
		 }    
		 else if(sym=="lparen") 
		 {    
			 getsym();  
			 expression(fsys+"rparen"); 
			 if(sym=="rparen")
				 getsym();   
			 else error(22);   //漏右括号
		 }    
		 test(fsys,aaa+"lparen",23);//error因子后不能为此符号
	 }
}          //{因子处理子程序
void yy::term(symset fsys){

	 string mulop;
			 //{项处理子程序开始} //消去左递归     
			 factor(fsys+"times"+"slash");     
			 while(sym=="times"||sym=="slash")
			 {               
				 mulop=sym; 
				 getsym();             
				 factor(fsys+"times"+"slash");            
				 if(mulop=="times") gen(opr,0,4);                
				 else gen(opr,0,5);        
			 }      
}            // {项处理子程序}
void yy::expression(symset fsys){
	 string addop;
			 //{表达式处理子程序开始)
     			 
	 term(fsys);    
	 while(sym=="plus"||sym=="minus")   
	 {
		 addop=sym;
		 getsym();   
		 term(fsys+"plus"+"minus"); 
		 if(addop=="plus")  gen(opr,0,2);     		 
		 else gen(opr,0,3);         
		
	 }

			
}      //{表达式处理子程序} 
void yy::condition(symset fsys){

    string relop ;
	expression(fsys+"eql"+"neq"+"lss"+"gtr"+"leq"+"geq");			
	if(!(incl(aaa+"eql"+"neq"+"lss"+"gtr"+"leq"+"geq"))) error(20);  //应为关系运算符
	else{ 	
		relop=sym;
		getsym(); 
		expression(fsys); 
		if(relop=="eql")gen(opr,0,8);
		else if(relop=="neq")gen(opr,0,9);
		else if(relop=="lss")gen(opr,0,10);
		else if(relop=="gtr")gen(opr,0,12);
		else if(relop=="leq")gen(opr,0,13);
		else if(relop=="geq")gen(opr,0,11);
	}
}       // {条件表达式处理子程序开始}  
void yy::statement(symset fsys){

	//{语句处理子程序}fsys:symset
			 
			 int i,cx1,cx2;//{语句处理子程序开始}    
			 if(sym=="ident")
			 { 				 // {赋值语句处理}             
				 i=position(id);            
				 if(i==0) error(11);   //标识符未说明             
				 else if(table[i].kind!=variable)
				 {                       
					 error(12); // {对常量赋值}                      
					 i=0;                      
				 } 
				 getsym(); 
				 if(sym=="becomes") getsym(); 
				 else error(13) ; //应为=
				 expression(fsys);  
				 if(i!=0)	
				 {    
					gen(sto,lev-table[i].vv.vari.level,table[i].vv.vari.dr); 
					
				 } 
			 }else if(sym=="scanf")
			 {   // {读语句处理}
				 getsym(); 
				 if(sym!="lparen") error(34);  //漏左括号
				 else do
				 {  
					 getsym(); 
					 if(sym=="ident") 
						 i=position(id); 
					 else i=0;  
					 if(i==0) error(35); // read或write语句中缺"("
					 else{
						 gen(opr,0,16);   
						 gen(sto,lev-table[i].vv.vari.level,table[i].vv.vari.dr) ;					
					 }  
					 getsym(); 
				 }while(sym=="comma"); 
					 if(sym!="rparen")
					 {            
						 error(33); //嵌套深度超过允许值
						 while(!(incl(fsys))) getsym();
					 }else getsym();   
			 }else if(sym=="printfsym")
			 {   //{写语句处理}  
				 getsym();   
				 if(sym=="lparen")
				 {  
					 do{  
						 getsym();
						 if(sym=="upcomma")
						 {		
							 getsym();  
							 if(sym=="ident") i=position(id); 
							 else i=0;  
							 if(i==0) error(11);   //  标识符未说明 
							 else chwr[wx]=id;   
							 wx=wx+1;  
							 getsym(); 
							 if(sym=="upcomma") getsym();    
							 else error(36);  // write语句中需打印的标识符未加单引号
							 getsym();   
							 expression(fsys+"rparen"+"comma");
							 gen(opr,0,14);  
						 }else 	
						 {	
							 getsym(); 
							 expression(fsys+"rparen"+"comma");  
							 gen(opr,0,14);   
							 
						 }    
					 }while(sym=="comma");
						 if(sym!="rparen") error(33); //read或write语句中缺")"
						 else getsym();  
				 }   
				 gen(opr,0,15);
			 }else if(sym=="ifsym")				 
			
			 {    //{条件语句处理}     
					 
				 getsym(); 
				 if(sym!="lparen") error(34);//漏左括号
				 getsym();
				 condition(fsys+"elsesym"+"dosym");  
				 if(sym!="rparen") error(33); //漏右括号
				 else getsym(); 
				 if(sym=="elsesym") getsym(); 
				 else error(16);   //应为else
				 cx1=cx;gen(jpc,0,0);
				 statement(fsys); 
				 code[cx1].a=cx;   
			 }else if(sym=="beginsym")
			 {  //{复合语句处理)     
				
				 getsym();  
				 statement(fsys+"elsesym"+"semicolon") ;      
				 while(incl(statbegsys+"semicolon")) 
				 { 
					 if(sym=="semicolon") getsym();   
					 else error(10); //句子间没封号  
					 statement(fsys+"semicolon"+"endsym");   
				 }        
				 if(sym=="endsym") getsym();     
				 else error(17); //为} 				
			 }else if(sym=="whilesym")
			 { //{循环语句处理}
				 cx1=cx;
				 getsym();	
				 if(sym!="lparen") error(34);//漏左括号
				 else getsym();
				 condition(fsys+"dosym");  	
				 cx2=cx;
				 gen(jpc,0,0);
				 
				 if(sym!="rparen")
					 {            
						 error(33); //漏有括号
						 while(!(incl(fsys))) getsym();
					 }else getsym(); 
				 if(sym=="dosym") getsym(); 
				 else error(18);//应为'do' 
				 statement(fsys);
				 gen(jmp,0,cx1); 
				 code[cx2].a=cx;
				 test(fsys,bbb,19); 
			 }//{语句处理子程序结束
 
}       //{语句处理子程序}
void yy::block(int lev,int tx,symset fsys){

	//{分程序处理模块}
				 int  tx0;    //{起始标识符的下标}  
				 dx=3; tx0=tx; 
				 table[tx].vv.vari.dr=cx;  
				 gen(jmp,0,0);  
				 if(lev>levmax) error(32);//	嵌套深度超过允许值
				 do
				 {
					 if(sym=="constsym")
					 {    //{常量说明部分处理}
						 getsym();
						 do{
							 constdeclaration();
							 while(sym=="comma"){ 
								 getsym(); 
								 constdeclaration();
							 }
							 if(sym=="semicolon") getsym(); 
							 else error(5);//:    漏掉逗号或分号
						 }while(sym=="ident"); 
					 }    //{常量说明部分处理结束} 
					 if(sym=="intsym")  //{变量说明部分处理}
					 {
						 getsym();   
						 do{ 
							 vardeclaration();
							 while(sym=="comma")
							 {  
								 getsym();	
								 vardeclaration();
							 }
							 if(sym=="semicolon")getsym();
							 else{ 
								 error(5) ;//5:    漏掉逗号或分号
								 getsym();
							 }
						 }while(sym=="ident");// {变量说明部分处理结束)
					 }
					 test(statbegsys+"ident",declbegsys,7);
				 }while(incl(declbegsys));
				 code[table[tx0].vv.vari.dr].a=cx;    
				 table[tx0].vv.vari.dr=cx;    //{代码开始地址}	
				 cx0=cx;
				 gen(int1,0,dx);
				 statement(fsys+"semicolon"+"endsym");
				 gen(opr,0,0);    //{返回}
				 test(fsys,bbb,8);
				 listcode();
}           //{分程序处理模块}
int yy::base(int l){
	int b1;		
	b1=b; //{顺静态链求层差为1的基地址}	
	while(l>0){	
		b1=s[b1] ;
		l=l-1;}	
	return b1;
}
void yy::interpret(){
	int  p,t;//{p:程序地址寄存器, b:基地址寄存器,  t:栈顶地址寄存器} 
	instruction i;  //{指令寄存器}  		
	//int s[stacksize];//{数据存储}
    fout<<"start PL/0'" ;
	t=0;b=1;p=0;wx=1;
	s[1]=0;s[2]=0;s[3]=0;
	do{
		i=code[p];p=p+1;  
		switch(i.f){  
		case lit:t=t+1;s[t]=i.a;
			break; 
		case opr:{ 
			switch(i.a){  
			case 0:t=b-1;p=s[t+3];b=s[t+2];
				break;//{返回}		
			case  1:s[t]=-s[t];
				break;    
			case 2:t=t-1;s[t]=s[t]+s[t+1];
				break;		
			case  3:t=t-1;s[t]=s[t]-s[t+1];
				break;
			case 4:t=t-1;s[t]=s[t]*s[t+1];
				break;
			case 5:t=t-1;s[t]=s[t]/s[t+1];
				break; 
			case 6:{
				if(s[t]%2==1)s[t]=1; 
				else s[t]=0; 
				   }
				break;
			case 8:t=t-1;s[t]=int(s[t]==s[t+1]);
				break;		
			case 9:t=t-1;s[t]=int(s[t]!=s[t+1]);
				break;  
			case 10:t=t-1;s[t]=int(s[t]<s[t+1]);
				break;
			case 11:t=t-1;s[t]=int(s[t]>=s[t+1]);
				break;
			case 12:t=t-1;s[t]=int(s[t]>s[t+1]);
				break;
			case 13:t=t-1;s[t]=int(s[t]<=s[t+1]);
				break;
			case  14://fout<<chwr[wx];
				fout<<s[t] ;
				t=t-1;wx=wx+1;
				break;
			case 15://writeln(fw2);
				break;
			case 16:t=t+1;fi>>s[t];
				break;
			} 
				 }break;		
		case lod: t=t+1;s[t]=s[base(1)+i.a];
			break;
        
		case sto:s[base(1)+i.a]=s[t];
			t=t-1;
			break;
		case cal://{generte new block mark}                   
			s[t+1]=base(1);				
			s[t+2]=b;               
			s[t+3]=p;			
			b=t+1;			
			p=i.a;             
			break;        
		case  int1:t=t+i.a;
			break;
		case jmp:p=i.a;
			break;        
		case jpc:if(s[t]==0) p=i.a;                        
			t=t-1;                 
			break;	 
		}  //{with,case  }	
	}while(p!=0);
	fout<<"end PL/0";


}       // {执行目录代码子程序} 
yy::yy(){
	fin.open("ff.txt",ios::in);
	fi.open("fi.txt",ios::in);
	fout.open("fw.txt",ios::out);
	word[1]="const";  word[2]="do" ;
	word[3]="else" ;  word[4]="if" ;
	word[5]="int" ;   word[6]="main";
	word[7]="printf";  word[8]="scanf" ;
	word[9]="while" ; 
	wsym[1]="constsym";    wsym[2]="dosym";
	wsym[3]="elsesym";     wsym[4]="ifsym";
	wsym[5]="intsym";      wsym[6]="mainsym";
	wsym[7]="printfsym";   wsym[8]="scanfsym";
	wsym[9]="whilesym"; 
	mnemonic[0]="lit" ;   mnemonic[1]="opr" ;
	mnemonic[2]="lod" ;   mnemonic[3]="sto" ;
	mnemonic[4]="cal";    mnemonic[5]="int" ;
	mnemonic[6]="jmp";    mnemonic[7]="jpc" ;  
	declbegsys=declbegsys+"constsym"+"intsym";
	statbegsys=statbegsys+"beginsym"+"callsym"+"ifsym"+"whilesym";   
	facbegsys=facbegsys+"ident"+"number"+"lparen"; 
	err=0;cw=1;wx=1; 
	tx=0;
	cc=0;cx=0;ll=0;ch=' ';kk=a1;getsym();  
	if(sym!="mainsym")error(66);//cheng xu yi main kai tou
	else getsym();
	if(sym!="lparen") error(34);//lou zuo kuo hao
	else getsym();
	if(sym!="rparen") error(34);//lou you kuo hao
	else getsym();
	if(sym!="beginsym") error(344);
	else getsym();
	block(0,0,declbegsys+statbegsys+"endsym");//(); 
	if(sym!="endsym") error(9); //jie su fu }
	if(err==0) interpret() ;     
	else fout<<"error in PL/0 program";
	
	fin.close();
	fi.close();
	fout.close();
}
void main(){

	yy ji060227;


}

⌨️ 快捷键说明

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