📄 parser.y
字号:
r_type_inst ($1.i, $3.i, 0, $2.i); } | CTL_COP_OP COP_REG COP_REG { r_type_inst ($1.i, $3.i, 0, $2.i); } | FP_ABS_OP F_DEST F_SRC1 { r_type_inst ($1.i, $2.i, $3.i, 0); } | FP_BINARY_OP F_DEST F_SRC1 F_SRC2 { r_type_inst ($1.i, $2.i, $3.i, $4.i); } | FP_CONVERT_OP F_DEST F_SRC2 { r_type_inst ($1.i, $2.i, $3.i, 0); } | FP_NEG_OP F_DEST F_SRC2 { r_type_inst ($1.i, $2.i, $3.i, 0); } | FP_CMP_OP F_SRC1 F_SRC2 { r_cond_type_inst ($1.i, $2.i, $3.i); } ;LOAD_OP: Y_LB_OP | Y_LBU_OP | Y_LH_OP | Y_LHU_OP | Y_LW_OP | Y_LWL_OP | Y_LWR_OP | Y_LD_POP | Y_PFW_OP ;LOAD_COP: Y_LWC0_OP | Y_LWC2_OP | Y_LWC3_OP ;LOAD_IMM_OP: Y_LUI_OP;ULOADH_POP: Y_ULH_POP | Y_ULHU_POP ;LOADF_OP: Y_LWC1_OP | Y_L_S_POP | Y_L_D_POP ;STORE_OP: Y_SB_OP | Y_SH_OP | Y_SW_OP | Y_SWL_OP | Y_SWR_OP | Y_SD_POP ;STORE_COP: Y_SWC0_OP | Y_SWC2_OP | Y_SWC3_OP ;STOREF_OP: Y_SWC1_OP | Y_S_S_POP | Y_S_D_POP ;SYS_OP: Y_RFE_OP | Y_SYSCALL_OP ;/* These binary operations have immediate analogues. */BINARY_OP_I: Y_ADD_OP | Y_ADDU_OP | Y_AND_OP | Y_XOR_OP | Y_OR_OP | Y_SLT_OP | Y_SLTU_OP ;BINARY_OPR_I: Y_SLLV_OP | Y_SRAV_OP | Y_SRLV_OP ;BINARY_IMM_ARITH_OP: Y_ADDI_OP | Y_ADDIU_OP | Y_SLTI_OP | Y_SLTIU_OP ;BINARY_IMM_LOGICAL_OP: Y_ANDI_OP | Y_ORI_OP | Y_XORI_OP ;SHIFT_OP: Y_SLL_OP | Y_SRA_OP | Y_SRL_OP ;/* These binary operations do not have immediate analogues. */BINARY_OP_NOI: Y_NOR_OP ;SUB_OP: Y_SUB_OP | Y_SUBU_OP ;DIV_POP: Y_DIV_OP | Y_DIVU_OP | Y_REM_POP | Y_REMU_POP ;MUL_POP: Y_MUL_POP | Y_MULO_POP | Y_MULOU_POP ;SET_LE_POP: Y_SLE_POP | Y_SLEU_POP ;SET_GT_POP: Y_SGT_POP | Y_SGTU_POP ;SET_GE_POP: Y_SGE_POP | Y_SGEU_POP ;SET_EQ_POP: Y_SEQ_POP | Y_SNE_POP ;MULT_OP: Y_MULT_OP | Y_MULTU_OP ;NULLARY_BR_OP: Y_BC0T_OP | Y_BC1T_OP | Y_BC2T_OP | Y_BC3T_OP | Y_BC0F_OP | Y_BC1F_OP | Y_BC2F_OP | Y_BC3F_OP ;UNARY_BR_OP: Y_BGEZ_OP | Y_BGEZAL_OP | Y_BGTZ_OP | Y_BLEZ_OP | Y_BLTZ_OP | Y_BLTZAL_OP ;UNARY_BR_POP: Y_BEQZ_POP | Y_BNEZ_POP ;BINARY_BR_OP: Y_BEQ_OP | Y_BNE_OP ;BR_GT_POP: Y_BGT_POP | Y_BGTU_POPBR_GE_POP: Y_BGE_POP | Y_BGEU_POPBR_LT_POP: Y_BLT_POP | Y_BLTU_POPBR_LE_POP: Y_BLE_POP | Y_BLEU_POP ;J_OPS: Y_J_OP | Y_JR_OP | Y_JAL_OP | Y_JALR_OP ;B_OP: Y_B_POP | Y_BAL_POP ;MOVE_COP_OP: Y_MOV_S_OP | Y_MOV_D_OP ;MOV_FROM_HILO_OP: Y_MFHI_OP | Y_MFLO_OP ;MOV_TO_HILO_OP: Y_MTHI_OP | Y_MTLO_OP ;MOV_COP_OP: Y_MFC0_OP | Y_MFC1_OP | Y_MFC1_D_POP | Y_MFC2_OP | Y_MFC3_OP | Y_MTC0_OP | Y_MTC1_OP | Y_MTC1_D_POP | Y_MTC2_OP | Y_MTC3_OP ;CTL_COP_OP: Y_CFC0_OP | Y_CFC1_OP | Y_CFC2_OP | Y_CFC3_OP | Y_CTC0_OP | Y_CTC1_OP | Y_CTC2_OP | Y_CTC3_OP ;FP_ABS_OP: Y_ABS_S_OP | Y_ABS_D_OP ;FP_BINARY_OP: Y_ADD_S_OP | Y_ADD_D_OP | Y_DIV_S_OP | Y_DIV_D_OP | Y_MUL_S_OP | Y_MUL_D_OP | Y_SUB_S_OP | Y_SUB_D_OP ;FP_CONVERT_OP: Y_CVT_D_S_OP | Y_CVT_D_W_OP | Y_CVT_S_D_OP | Y_CVT_S_W_OP | Y_CVT_W_D_OP | Y_CVT_W_S_OP ;FP_NEG_OP: Y_NEG_S_OP | Y_NEG_D_OP ;FP_CMP_OP: Y_C_F_S_OP | Y_C_UN_S_OP | Y_C_EQ_S_OP | Y_C_UEQ_S_OP | Y_C_OLT_S_OP | Y_C_OLE_S_OP | Y_C_ULT_S_OP | Y_C_ULE_S_OP | Y_C_SF_S_OP | Y_C_NGLE_S_OP | Y_C_SEQ_S_OP | Y_C_NGL_S_OP | Y_C_LT_S_OP | Y_C_NGE_S_OP | Y_C_LE_S_OP | Y_C_NGT_S_OP | Y_C_F_D_OP | Y_C_UN_D_OP | Y_C_EQ_D_OP | Y_C_UEQ_D_OP | Y_C_OLT_D_OP | Y_C_OLE_D_OP | Y_C_ULT_D_OP | Y_C_ULE_D_OP | Y_C_SF_D_OP | Y_C_NGLE_D_OP | Y_C_SEQ_D_OP | Y_C_NGL_D_OP | Y_C_LT_D_OP | Y_C_NGE_D_OP | Y_C_LE_D_OP | Y_C_NGT_D_OP ;ASM_DIRECTIVE: Y_ALIAS_DIR Y_REG Y_REG | Y_ALIGN_DIR EXPR { align_data ($2.i); } | Y_ASCII_DIR {null_term = 0;} STR_LST { if (text_dir) yyerror ("Can't put data in text segment"); } | Y_ASCIIZ_DIR {null_term = 1;} STR_LST { if (text_dir) yyerror ("Can't put data in text segment"); } | Y_ASM0_DIR | Y_BGNB_DIR Y_INT | Y_BYTE_DIR {store_op = store_byte;} EXPR_LST { if (text_dir) yyerror ("Can't put data in text segment"); } | Y_COMM_DIR ID EXPR { align_data (2); if (lookup_label ((char*)$2.p)->addr == 0) { record_label ((char*)$2.p, current_data_pc (), 1); if ($1.p) free($1.p); } increment_data_pc ($3.i); } | Y_DATA_DIR { user_kernel_data_segment (0); data_dir = 1; text_dir = 0; enable_data_alignment (); } | Y_DATA_DIR Y_INT { user_kernel_data_segment (0); data_dir = 1; text_dir = 0; enable_data_alignment (); set_data_pc ($2.i); } | Y_K_DATA_DIR { user_kernel_data_segment (1); data_dir = 1; text_dir = 0; enable_data_alignment (); } | Y_K_DATA_DIR Y_INT { user_kernel_data_segment (1); data_dir = 1; text_dir = 0; enable_data_alignment (); set_data_pc ($2.i); } | Y_DOUBLE_DIR { store_op = store_double; if (data_dir) set_data_alignment(3); } FP_EXPR_LST { if (text_dir) yyerror ("Can't put data in text segment"); } | Y_END_DIR OPTIONAL_ID | Y_ENDB_DIR Y_INT | Y_ENDR_DIR | Y_ENT_DIR ID | Y_ENT_DIR ID Y_INT | Y_EXTERN_DIR ID EXPR { extern_directive ((char*)$2.p, $3.i); } | Y_ERR_DIR { fatal_error ("File contains an .err directive\n"); } | Y_FILE_DIR Y_INT Y_STR | Y_FLOAT_DIR { store_op = store_float; if (data_dir) set_data_alignment (2); } FP_EXPR_LST { if (text_dir) yyerror ("Can't put data in text segment"); } | Y_FMASK_DIR Y_INT Y_INT | Y_FRAME_DIR REGISTER Y_INT REGISTER | Y_GLOBAL_DIR ID { make_label_global ((char*)$2.p); if ($2.p) free($2.p); } | Y_HALF_DIR { store_op = store_half; if (data_dir) set_data_alignment (1); } EXPR_LST { if (text_dir) yyerror ("Can't put data in text segment"); } | Y_LABEL_DIR ID { record_label ((char*)$2.p, text_dir ? current_text_pc () : current_data_pc (), 1); if ($1.p) free($1.p); } | Y_LCOMM_DIR ID EXPR { lcomm_directive ((char*)$2.p, $3.i); } /* Produced by cc 2.10 */ | Y_LIVEREG_DIR Y_INT Y_INT | Y_LOC_DIR Y_INT Y_INT | Y_MASK_DIR Y_INT Y_INT | Y_NOALIAS_DIR Y_REG Y_REG | Y_OPTIONS_DIR ID | Y_REPEAT_DIR EXPR { yyerror ("Warning: repeat directive ignored"); } | Y_RDATA_DIR { user_kernel_data_segment (0); data_dir = 1; text_dir = 0; enable_data_alignment (); } | Y_RDATA_DIR Y_INT { user_kernel_data_segment (0); data_dir = 1; text_dir = 0; enable_data_alignment (); set_data_pc ($2.i); } | Y_SDATA_DIR { user_kernel_data_segment (0); data_dir = 1; text_dir = 0; enable_data_alignment (); } | Y_SDATA_DIR Y_INT { user_kernel_data_segment (0); data_dir = 1; text_dir = 0; enable_data_alignment (); set_data_pc ($2.i); } | Y_SET_DIR ID { if (streq ((char*)$2.p, "noat")) noat_flag = 1; else if (streq ((char*)$2.p, "at")) noat_flag = 0; } | Y_SPACE_DIR EXPR { if (data_dir) increment_data_pc ($2.i); else if (text_dir) increment_text_pc ($2.i); } | Y_STRUCT_DIR EXPR { yyerror ("Warning: struct directive ignored"); } | Y_TEXT_DIR { user_kernel_text_segment (0); data_dir = 0; text_dir = 1; enable_data_alignment (); } | Y_TEXT_DIR Y_INT { user_kernel_text_segment (0); data_dir = 0; text_dir = 1; enable_data_alignment (); set_text_pc ($2.i); } | Y_K_TEXT_DIR { user_kernel_text_segment (1); data_dir = 0; text_dir = 1; enable_data_alignment (); } | Y_K_TEXT_DIR Y_INT { user_kernel_text_segment (1); data_dir = 0; text_dir = 1; enable_data_alignment (); set_text_pc ($2.i); } | Y_VERSTAMP_DIR Y_INT Y_INT | Y_VREG_DIR REGISTER Y_INT Y_INT | Y_WORD_DIR { store_op = store_word_data; if (data_dir) set_data_alignment (2); } EXPR_LST ;ADDRESS: {only_id = 1;} ADDR {only_id = 0; $$ = $2;}ADDR: '(' REGISTER ')' { $$.p = make_addr_expr (0, NULL, $2.i); } | ABS_ADDR { $$.p = make_addr_expr ($1.i, NULL, 0); } | ABS_ADDR '(' REGISTER ')' { $$.p = make_addr_expr ($1.i, NULL, $3.i); } | Y_ID { $$.p = make_addr_expr (0, (char*)$1.p, 0); if ($1.p) free ((char*)$1.p); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -