求用MFC可视化编程,急!急!急!题目如下,求大神帮忙

时间:2021-11-14 01:33:24
题目:将FOR语句转换成四元式的程序实现
设计内容及要求:设计一个语法制导翻译器,将FOR语句翻译成四元式。要求:先确定一个定义FOR语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。对用户输入的任意一个正确的FOR语句,程序将其转换成四元式输出(可按一定格式输出到指定文件中)。
附上一段程序,能否把这段程序可视化
#include "symr.h" 

//S-->for S1 S2 S3 Incycle
//S1-->(E1;
//S2-->E2; 
//S3-->E1)
//Incycle-->E1;
//(E1为赋值语句) 
//(E2为布尔表达式) 

void phrasinganalyse();
void eval(int *,int *);
char judge(string,string);
void Trans_for();

string s[10]={"T1","T2","T3","T4","T5","T6","T7","T8","T9","T10"};
string ad[5]={"Begin","Adress2","Again","Adress4","Exit"};
string ad_e[20]={"(0)","(1)","(2)","(3)","(4)","(5)","(6)","(7)","(8)","(9)","(10)","(11)","(12)","(13)","(14)","(15)","(16)","(17)","(18)","(19)"};

struct goto_adress {
       string name;
       int value;
       } adress[5]; //跳转地址 
       
struct expression_adress {
       string name;
       int value;
       } e_adress[20]; //四元式地址 

stack <string> sqstacks;
stack <string> sqstackr;
fstream outfile2("outfile2.txt",ios::out);
fstream outfile3("outfile3.txt",ios::out);
string buffer[50];
extern int n; 
extern Symbolattribute symattri[100];
int i;


int main (){
    i=Symbolanalysis();
    phrasinganalyse();
    cin>>i;
    outfile2.close();
    return 0;


//语法语义分析 
void phrasinganalyse(){
    for (int m=0;m<5;m++)
         adress[m].name=ad[m];
    for (m=0;m<20;m++)
         e_adress[m].name=ad_e[m]; 
string type;
string ch;
do{

        type=symattri[i].stype;
if(type=="4"){ 
ch=symattri[i].svalue;
if(ch=="for") Trans_for();
}
        
i++;
}while(i<n);
return;
}

//跳转地址回填 
void backpath(int l,int *j){
     adress[l].value=(*j);
     } 

/*循环语句*/ 
void Incircle(int *k,int *j){
int o=i;
cout<<adress[2].name<<": "<<endl;
outfile2<<ad[2]<<": "<<"\n";
backpath(2,j);
while(symattri[i].svalue!=")") i++;
while(symattri[i].svalue=="{"||symattri[i].svalue==" "||symattri[i].svalue==")"||symattri[i].svalue=="\n") i++;
eval(k,j);
i=o;
}


/*初值赋值语句*/ 
void For_s1(int * k,int *j){
cout<<adress[0].name<<": "<<endl;
outfile2<<adress[0].name<<": "<<"\n";
backpath(0,j);
eval(k,j);
}

/*条件判断语句*/ 
void For_s2(int * k,int *j){
cout<<adress[1].name<<": "<<endl;
outfile2<<adress[1].name<<": "<<"\n";  
    backpath(1,j);
eval(k,j);
Incircle(k,j);
}

/*变量更新语句 */
void For_s3(int * k,int *j){
cout<<adress[3].name<<": "<<endl;
outfile2<<adress[3].name<<": "<<"\n";  
backpath(3,j);
eval(k,j);
cout<<e_adress[*j].name<<"(jump    "+adress[1].name+")"<<endl;
outfile2<<e_adress[*j].name<<"(jump    "+adress[1].name+")"<<"\n"; 
(*j)++;
e_adress[*j].value=(*j);
cout<<adress[4].name<<": "<<endl;
    backpath(4,j);
outfile2<<adress[4].name<<": "<<"\n";  
cout<<"analysis has finished"<<endl;
}     

/*for语句入口*/ 
void Trans_for(){
i++;
if(symattri[i].svalue!="(") return;      //actually,here should go to error();
i++;
int k=0;
int j=0;
For_s1(&k,&j);    //S=>S1S2S3
For_s2(&k,&j);
For_s3(&k,&j);
     for(int m=0;m<5;m++){
         cout<<adress[m].name<<"="<<adress[m].value<<endl;
         outfile3<<adress[m].name<<"="<<adress[m].value<<"\n";
         }
return;
}

/*赋值语句分析函数*/ 
void eval(int *k,int *j){
int m=i;
string ch;
string sh;
string *p;
string *q;
sqstacks.push("#");
sqstackr.push("#");
while(!(symattri[i].svalue==";")&&!(symattri[i].svalue==")")){

if(symattri[i].stype=="1"||symattri[i].stype=="2"||symattri[i].stype=="3") 
{
ch=symattri[i].svalue;
sqstacks.push(ch);
i++;}
if(!(symattri[i].svalue==";")&&!(symattri[i].svalue==")"))
if(symattri[i].stype=="6"){
ch=symattri[i].svalue;
p=&sqstackr.top();
switch(judge(ch,*p)){
case'=':;
case'>':;
sqstackr.push(ch);
i++;
break;
case '<':
sqstacks.push(symattri[i+1].svalue);
buffer[2]=sqstacks.top();sqstacks.pop();
buffer[1]=sqstackr.top();sqstackr.pop();
buffer[0]=sqstacks.top();sqstacks.pop();
buffer[0]=e_adress[*j].name+"("+buffer[1]+" "+buffer[0]+" "+buffer[2]+" "+s[*k]+")"+"\n";
sqstacks.push(s[*k]);
sqstackr.push(ch);
(*k)++; 
(*j)++;
e_adress[*j].value=(*j);
cout<<*buffer;
outfile2<<*buffer; 
i++;
break;} 
if(!(symattri[i].stype=="1"||symattri[i].stype=="2"||symattri[i].stype=="3"||symattri[i].svalue==";")){
cout<<"cancel...."<<endl;
}

}
else {cout<<"wrong sentence"<<endl;i++;}
else {       while(sqstackr.top()!="#"&&sqstackr.top()!="="&&sqstackr.top()!="<"&&sqstackr.top()!=">"){
buffer[2]=sqstacks.top();sqstacks.pop();
buffer[1]=sqstackr.top();sqstackr.pop();
buffer[0]=sqstacks.top();sqstacks.pop();
buffer[0]=e_adress[*j].name+"("+buffer[1]+" "+buffer[0]+" "+buffer[2]+" "+s[*k]+")"+"\n";
sqstacks.push(s[*k]);
//   sqstackr.push(ch);


cout<<*buffer; 
outfile2<<*buffer; 
(*k)++;   
                (*j)++;
                e_adress[*j].value=(*j);    }
if(sqstackr.top()=="=") {
buffer[2]=sqstacks.top();sqstacks.pop();
buffer[1]=sqstackr.top();sqstackr.pop();
buffer[0]=sqstacks.top();sqstacks.pop();
buffer[0]=e_adress[*j].name+"("+buffer[1]+" "+buffer[2]+"      "+buffer[0]+")"+"\n";
cout<<*buffer;
outfile2<<*buffer;
(*j)++;
e_adress[*j].value=(*j);
}
            else if(sqstackr.top()==">"||sqstackr.top()=="<"){
buffer[2]=sqstacks.top();sqstacks.pop();
buffer[1]="j"+sqstackr.top();sqstackr.pop();
buffer[0]=sqstacks.top();sqstacks.pop();
buffer[0]=e_adress[*j].name+"("+buffer[1]+" "+buffer[0]+" "+buffer[2]+" "+ad[2]+")"+"\n";
cout<<*buffer;
outfile2<<*buffer;
(*j)++;
e_adress[*j].value=(*j);
cout<<e_adress[*j].name<<"(jump      "<<adress[4].name<<")"<<endl;
outfile2<<e_adress[*j].name<<"(jump      "<<adress[4].name<<")"<<"\n";
(*j)++;
e_adress[*j].value=(*j);
}

}                                     
}      
i++;             
}                                   


char judge(string a,string b){
if((a=="="||a=="+"||a=="-"||a=="<"||a==">"||a=="<="||a==">="||a=="#")&&(b=="*"||b=="/")) return '<';
else if((b=="="||b=="+"||b=="-"||b=="<"||b==">"||b=="<="||b==">="||b=="#")&&(a=="*"||a=="/")) return '>';
else return '=';    


}     
 

4 个解决方案

#1


希望能得到帮助,发邮箱也可以,谢谢,,,1158978702@qq.com

#2


什么叫可视化?你说明白一点......

#3


引用 2 楼 happyparrot 的回复:
什么叫可视化?你说明白一点......

只要从界面进入即可,区别于黑白框,以前都是用黑白框,没用过MFC,所以我只是小白

#4


您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法

#1


希望能得到帮助,发邮箱也可以,谢谢,,,1158978702@qq.com

#2


什么叫可视化?你说明白一点......

#3


引用 2 楼 happyparrot 的回复:
什么叫可视化?你说明白一点......

只要从界面进入即可,区别于黑白框,以前都是用黑白框,没用过MFC,所以我只是小白

#4


您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法