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

📄 calc_yacc.y

📁 利用flex和bison做的简易C语言编译器核心 支持C语言的大部分运算操作和语法,但是没有 变量声明和函数声明 适合制作虚拟机之类的 输出结果是伪汇编代码 我会继续更新
💻 Y
📖 第 1 页 / 共 2 页
字号:
            case IFX:                if(p_node->node_data.op.op_n > 2)                {                    char m_LabStrA[16];                    char m_LabStrB[16];                    /*if else*/                    cc_builder(p_node->node_data.op.op_s[0]);                    zzlabel(m_LabStrA);                    fprintf(asout, "jump_z %s\n", m_LabStrA);                    cc_builder(p_node->node_data.op.op_s[1]);                    zzlabel(m_LabStrB);                    fprintf(asout, "jump   %s\n", m_LabStrB);                    fprintf(asout, "label: %s\n", m_LabStrA);                    cc_builder(p_node->node_data.op.op_s[2]);                    fprintf(asout, "label: %s\n", m_LabStrB);                }                else                {                    char m_LabStrA[16];                    /*if then*/                    cc_builder(p_node->node_data.op.op_s[0]);                    zzlabel(m_LabStrA);                    fprintf(asout, "jump_z %s\n", m_LabStrA);                    cc_builder(p_node->node_data.op.op_s[1]);                    fprintf(asout, "label: %s\n", m_LabStrA);                }                break;            case GOTO:                fprintf(asout,"jump   %s\n", p_node->                        node_data.op.op_s[0]->                        node_data.id.s_label);                break;            case LABE:                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 DO: /* do ... while(...); */            	{                    char m_LabStrA[16];	            	zzlabel(m_LabStrA);	            	fprintf(asout, "label: %s\n", m_LabStrA);	            	cc_builder(p_node->node_data.op.op_s[0]);	            	cc_builder(p_node->node_data.op.op_s[1]);	            	fprintf(asout, "jump_n %s\n", m_LabStrA);            	}            	break;            case WH: /* while(...) ...     */            	{                    char m_LabStrA[16];                    char m_LabStrB[16];					zzlabel(m_LabStrA);	            	fprintf(asout, "label: %s\n", m_LabStrA);	            	cc_builder(p_node->node_data.op.op_s[0]);	            	zzlabel(m_LabStrB);	            	fprintf(asout, "jump_z %s\n", m_LabStrB);	            	cc_builder(p_node->node_data.op.op_s[1]);	            	fprintf(asout, "jump   %s\n", m_LabStrA);	            	fprintf(asout, "label: %s\n", m_LabStrB);            	}            	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,"cn_pop\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,"as_add %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,"as_sub %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,"as_mul %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,"as_div %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,"as_bal %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,"as_and %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,"as_xor %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,"as_or  %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,"as_shl %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,"as_shr %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,"lg_or \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,"lg_and\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,"bt_or \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,"bt_xor\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,"bt_and\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_l  \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_g  \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,"bt_shl\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,"bt_shr\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,"nb_add\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,"nb_sub\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,"nb_mul\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,"nb_div\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,"nb_bal\n");                break;            case '!':                cc_builder(p_node->node_data.op.op_s[0]);                fprintf(asout,"lg_not\n");                break;            case '~':                cc_builder(p_node->node_data.op.op_s[0]);                fprintf(asout,"bt_not\n");                break;            case UMI:                cc_builder(p_node->node_data.op.op_s[0]);                fprintf(asout,"nb_umi\n");                break;            default:                return(0);            }            break;        default:            return(0);        }        return(1);    }    return(0);}void yyerror(char *s){}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -