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

📄 1.cpp

📁 用C写的简易C编译器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
     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 + -