设计内容及要求:设计一个语法制导翻译器,将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
只要从界面进入即可,区别于黑白框,以前都是用黑白框,没用过MFC,所以我只是小白
#4
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
#1
希望能得到帮助,发邮箱也可以,谢谢,,,1158978702@qq.com
#2
什么叫可视化?你说明白一点......
#3
只要从界面进入即可,区别于黑白框,以前都是用黑白框,没用过MFC,所以我只是小白
#4
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法