📄 calc_yacc.y
字号:
fprintf(asout, "label: %s\n", m_LabStrC); cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout, "jmp_nz %s\n", m_LabStrC); fprintf(asout, "label: %s\n", m_LabStrB); g_label_break = m_OldLabB; g_label_conti = m_OldLabC; } break; case FOR: /* for(... ; ... ; ...) ... */ { char m_LabStrA[8]; char m_LabStrB[8]; char m_LabStrC[8]; char *m_OldLabB; char *m_OldLabC; zzlabel(m_LabStrA); zzlabel(m_LabStrB); zzlabel(m_LabStrC); m_OldLabB = g_label_break; m_OldLabC = g_label_conti; g_label_break = m_LabStrB; g_label_conti = m_LabStrC; cc_exp_for(p_node->node_data.op.op_s[0]); fprintf(asout, "label: %s\n", m_LabStrA); if(cc_builder(p_node->node_data.op.op_s[1])) fprintf(asout, "jmp_ez %s\n", m_LabStrB); cc_builder(p_node->node_data.op.op_s[3]); fprintf(asout, "label: %s\n", m_LabStrC); cc_exp_for(p_node->node_data.op.op_s[2]); fprintf(asout, "jmp_to %s\n", m_LabStrA); fprintf(asout, "label: %s\n", m_LabStrB); g_label_break = m_OldLabB; g_label_conti = m_OldLabC; } break; case WHILE: /* while(...) ... */ { char m_LabStrB[8]; /*break*/ char m_LabStrC[8]; /*conti*/ char *m_OldLabB; char *m_OldLabC; zzlabel(m_LabStrB); zzlabel(m_LabStrC); m_OldLabB = g_label_break; m_OldLabC = g_label_conti; g_label_break = m_LabStrB; g_label_conti = m_LabStrC; fprintf(asout, "label: %s\n", m_LabStrC); cc_builder(p_node->node_data.op.op_s[0]); fprintf(asout, "jmp_ez %s\n", m_LabStrB); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout, "jmp_to %s\n", m_LabStrC); fprintf(asout, "label: %s\n", m_LabStrB); g_label_break = m_OldLabB; g_label_conti = m_OldLabC; } break; case BREAK: if(NULL != g_label_break) fprintf(asout, "jmp_to %s\n", g_label_break); break; case CONTI: if(NULL != g_label_conti) fprintf(asout, "jmp_to %s\n", g_label_conti); break; case GOTO: fprintf(asout,"jmp_to %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; case LABEL: fprintf(asout,"label: %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); cc_builder(p_node->node_data.op.op_s[1]); break; case CALL: { int i = cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"push_i %d\n",i); fprintf(asout,"call_f %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); } break; case ',': { int i = cc_builder(p_node->node_data.op.op_s[0]); int j = cc_builder(p_node->node_data.op.op_s[1]); return(i + j); } break; case ';': cc_builder(p_node->node_data.op.op_s[0]); fprintf(asout,"pop_lo\n"); break; case ASSIGN: /* = */ cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"assign %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; case ASSADD: /* += */ cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"add_as %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; case ASSSUB: /* -= */ cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"sub_as %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; case ASSMUL: /* *= */ cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"mul_as %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; case ASSDIV: /* /= */ cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"div_as %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; case ASSBAL: /* %= */ cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"rem_as %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; case ASSAND: /* &= */ cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"and_as %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; case ASSXOR: /* ^= */ cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"xor_as %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; case ASSOOR: /* |= */ cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"oor_as %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; case ASSSHL: /* <<= */ cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"shl_as %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; case ASSSHR: /* >>= */ cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"shr_as %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; case OOR:/*||*/ cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"oor_lg\n"); break; case AND:/*&&*/ cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"and_lg\n"); break; case '|': cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"oor_bt\n"); break; case '^': cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"xor_bt\n"); break; case '&': cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"and_bt\n"); break; case CNE: cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"cmp_ne\n"); break; case CEQ: cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"cmp_eq\n"); break; case CLE:/*<=*/ cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"cmp_le\n"); break; case CGE:/*>=*/ cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"cmp_ge\n"); break; case '<': cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"cmp_ll\n"); break; case '>': cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"cmp_gg\n"); break; case SHL:/*<<*/ cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"shl_bt\n"); break; case SHR:/*>>*/ cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"shr_bt\n"); break; case '+': cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"add_nb\n"); break; case '-': cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"sub_nb\n"); break; case '*': cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"mul_nb\n"); break; case '/': cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"div_nb\n"); break; case '%': cc_builder(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"rem_nb\n"); break; case '!': cc_builder(p_node->node_data.op.op_s[0]); fprintf(asout,"not_lg\n"); break; case '~': cc_builder(p_node->node_data.op.op_s[0]); fprintf(asout,"not_bt\n"); break; case UMI: cc_builder(p_node->node_data.op.op_s[0]); fprintf(asout,"umi_nb\n"); break; case INCB: /* before, ++ v */ fprintf(asout,"inc_bf %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; case DECB: /* before, -- v */ fprintf(asout,"dec_bf %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; case INCA: /* after, v ++ */ fprintf(asout,"inc_af %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; case DECA: /* after, v -- */ fprintf(asout,"dec_af %s\n", p_node-> node_data.op.op_s[0]-> node_data.id.s_label); break; default: return(0); } break; default: return(0); } return(1); } return(0);}void cc_exp_for(Node *p_node){ if(NULL != p_node) { /*p_node->node_type = TYPE_OP */ /*p_node->node_data.op.oper == ',' */ /*p_node->node_data.op.op_n == 2 */ cc_exp_for(p_node->node_data.op.op_s[0]); cc_builder(p_node->node_data.op.op_s[1]); fprintf(asout,"pop_lo\n"); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -