📄 1.cpp
字号:
log<<"语法分析:S->i(G)S"<<endl;
}
if(s1->word=="while"){
l1=new Label;
l2=new Label;
m->code=l1->text+":\n"+s3->code+"\tpop ax\n\tcmp ax,1\n\tjne "+l2->text+"\n"+s5->code+"\tjmp "+l1->text+"\n"+l2->text+":\n";
delete l1;
delete l2;
log<<"语法分析:S->w(G)S"<<endl;
}
delete s1;
delete s2;
delete s3;
delete s4;
delete s5;
break;
case 5://OK
//S->i(G)SeS
ss.pop();
ss.pop();
ss.pop();
ss.pop();
ss.pop();
ss.pop();
ss.pop();
s7=sos.top();
sos.pop();
s6=sos.top();
sos.pop();
s5=sos.top();
sos.pop();
s4=sos.top();
sos.pop();
s3=sos.top();
sos.pop();
s2=sos.top();
sos.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='S';
m->line=s1->line;
sos.push(m);
//动作
l1=new Label;
l2=new Label;
if(s1->word=="if"){
m->code=s3->code+"\tpop ax\n\tcmp ax,1\n\tjnz "+l1->text+"\n"+s5->code+"\tjmp "+l2->text+"\n"+l1->text+":\n"+s7->code+l2->text+":\n";
log<<"语法分析:S->i(G)SeS"<<endl;
}
else
err(8,s6->line);
delete l1;
delete l2;
delete s1;
delete s2;
delete s3;
delete s4;
delete s5;
delete s6;
delete s7;
break;
case 6://ok
//S->w(G)S
log<<"语法分析:S->w(G)S"<<endl;
ss.pop();
ss.pop();
ss.pop();
ss.pop();
ss.pop();
s5=sos.top();
sos.pop();
s4=sos.top();
sos.pop();
s3=sos.top();
sos.pop();
s2=sos.top();
sos.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='S';
m->line=s1->line;
sos.push(m);
//动作
delete s1;
delete s2;
delete s3;
delete s4;
delete s5;
break;
case 7://OK
//S->zL;
log<<"语法分析:S->zL;"<<endl;
ss.pop();
ss.pop();
ss.pop();
s3=sos.top();
sos.pop();
s2=sos.top();
sos.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='S';
m->line=s1->line;
sos.push(m);
//动作
delete s1;
delete s2;
delete s3;
break;
case 8://OK
//S->@(E);
log<<"语法分析:S->@(E);"<<endl;
ss.pop();
ss.pop();
ss.pop();
ss.pop();
ss.pop();
s5=sos.top();
sos.pop();
s4=sos.top();
sos.pop();
s3=sos.top();
sos.pop();
s2=sos.top();
sos.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='S';
m->line=s1->line;
sos.push(m);
//动作
if(s1->word=="out"&&needOutSuppose)
m->code=s3->code+"\tpop ax\n\tcall outint\n";
else
err(6,s1->line);
delete s1;
delete s2;
delete s3;
delete s4;
delete s5;
break;
case 9://OK
//W->WS
log<<"语法分析:W->WS"<<endl;
ss.pop();
ss.pop();
s2=sos.top();
sos.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='W';
m->line=s1->line;
sos.push(m);
//动作
m->code=s1->code+s2->code;
delete s1;
delete s2;
break;
case 10://OK
//W->S
log<<"语法分析:W->S"<<endl;
ss.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='W';
m->line=s1->line;
sos.push(m);
//动作
m->code=s1->code;
delete s1;
break;
case 11://OK
//L->@
log<<"语法分析:L->@"<<endl;
ss.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='L';
m->line=s1->line;
sos.push(m);
//动作
if(!lookup(s1->word))
symbolList.insert(symbolList.end(),s1->word);
else
err(11,s1->line);
delete s1;
break;
case 12://OK
//L->L,@
log<<"语法分析:L->L,@"<<endl;
ss.pop();
ss.pop();
ss.pop();
s3=sos.top();
sos.pop();
s2=sos.top();
sos.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='L';
m->line=s1->line;
sos.push(m);
if(!lookup(s3->word))
symbolList.insert(symbolList.end(),s3->word);
else
err(11,s3->line);
delete s1;
delete s2;
delete s3;
break;
case 13://OK
//G->G&M
log<<"语法分析:G->G&M"<<endl;
ss.pop();
ss.pop();
ss.pop();
s3=sos.top();
sos.pop();
s2=sos.top();
sos.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='G';
m->line=s1->line;
sos.push(m);
//动作
if(s2->word=="&&")
m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tand ax,bx\n\tpush ax\n";
if(s2->word=="||")
m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tor ax,bx\n\tpush ax\n";
delete s1;
delete s2;
delete s3;
break;
case 14://OK
//G->M
log<<"语法分析:G->M"<<endl;
ss.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='G';
m->line=s1->line;
sos.push(m);
//动作
m->code=s1->code;
delete s1;
break;
case 15:
//M->E>E
log<<"语法分析:M->E>E"<<endl;
ss.pop();
ss.pop();
ss.pop();
s3=sos.top();
sos.pop();
s2=sos.top();
sos.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='M';
m->line=s1->line;
sos.push(m);
//动作
l1=new Label;
l2=new Label;
m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tcmp ax,bx\n";
if(s2->word==">")
m->code+="\tjg "+l1->text+"\n";
if(s2->word=="<")
m->code+="\tjl "+l1->text+"\n";
if(s2->word=="==")
m->code+="\tje "+l1->text+"\n";
if(s2->word=="!=")
m->code+="\tjne "+l1->text+"\n";
if(s2->word==">=")
m->code+="\tjge "+l1->text+"\n";
if(s2->word=="<=")
m->code+="\tjle "+l1->text+"\n";
m->code+="\tmov ax,0\n\tjmp "+l2->text+"\n"+l1->text+":\tmov ax,1\n"+l2->text+":\tpush ax\n";
delete l1;
delete l2;
delete s1;
delete s2;
delete s3;
break;
case 16://OK
//M->!M
log<<"语法分析:M->!M"<<endl;
ss.pop();
ss.pop();
s2=sos.top();
sos.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='M';
m->line=s1->line;
sos.push(m);
//动作
m->code="\tpop ax\n\txor ax,ax\n\tpush ax\n";
delete s1;
delete s2;
break;
case 17://OK
//M->(G)
log<<"语法分析:M->(G)"<<endl;
ss.pop();
ss.pop();
ss.pop();
s3=sos.top();
sos.pop();
s2=sos.top();
sos.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='M';
m->line=s1->line;
sos.push(m);
//动作
m->code=s2->code;
delete s1;
delete s2;
delete s3;
break;
case 18://OK
//E->E+T
log<<"语法分析:E->E+T"<<endl;
ss.pop();
ss.pop();
ss.pop();
s3=sos.top();
sos.pop();
s2=sos.top();
sos.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->line=s1->line;
m->group='E';
sos.push(m);
//动作
if(s2->word=="+")
m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tadd ax,bx\n\tpush ax\n";
if(s2->word=="-")
m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tsub ax,bx\n\tpush ax\n";
delete s1;
delete s2;
delete s3;
break;
case 19://OK
//E->T
log<<"语法分析:E->T"<<endl;
ss.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='E';
m->line=s1->line;
sos.push(m);
//动作
m->code=s1->code;
delete s1;
break;
case 20://OK
//T->T*F
log<<"语法分析:T->T*F"<<endl;
ss.pop();
ss.pop();
ss.pop();
s3=sos.top();
sos.pop();
s2=sos.top();
sos.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='T';
m->line=s1->line;
sos.push(m);
//动作
if(s2->word=="*")
m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tmov dx,0\n\tmul bx\n\tpush ax\n";
if(s2->word=="/")
m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tmov dx,0\n\tdiv bx\n\tpush ax\n";
if(s2->word=="%")
m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tmov dx,0\n\tdiv bx\n\tpush dx\n";
delete s1;
delete s2;
delete s3;
break;
case 21://OK
//T->F
log<<"语法分析:T->F"<<endl;
ss.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='T';
m->line=s1->line;
sos.push(m);
//动作
m->code=s1->code;
delete s1;
break;
case 22://OK
//F->(E)
log<<"语法分析:F->(E)"<<endl;
ss.pop();
ss.pop();
ss.pop();
s3=sos.top();
sos.pop();
s2=sos.top();
sos.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='F';
m->line=s1->line;
sos.push(m);
//动作
m->code=s2->code;
delete s1;
delete s2;
delete s3;
break;
case 23://OK
//F->@
log<<"语法分析:F->@"<<endl;
ss.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='F';
m->line=s1->line;
sos.push(m);
//动作
if(lookup(s1->word))
m->code="\tmov ax,"+s1->word+"\n\tpush ax\n";
else
err(10,s1->line);
delete s1;
break;
case 24://OK
//F->n
log<<"语法分析:F->n"<<endl;
ss.pop();
s1=sos.top();
sos.pop();
m=new Symbol;
m->group='F';
m->line=s1->line;
sos.push(m);
//动作
m->code="\tmov ax,"+s1->word+"\n\tpush ax\n";
delete s1;
break;
case 30:
//else
err(8,line);
ss.push(0);
ss.push(0);
ss.push(0);
ss.push(0);
ss.push(45);
s1=new Symbol;
s1->group='i';
s1->line=line;
sos.push(s1);
s1=new Symbol;
s1->group='(';
s1->line=line;
sos.push(s1);
s1=new Symbol;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -