📄 calc_yacc.c
字号:
YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (yymsg); } else { yyerror (YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } }#endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1;/*---------------------------------------------------.| yyerrorlab -- error raised explicitly by YYERROR. |`---------------------------------------------------*/yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1;/*-------------------------------------------------------------.| yyerrlab1 -- common code for both syntax error and YYERROR. |`-------------------------------------------------------------*/yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate;/*-------------------------------------.| yyacceptlab -- YYACCEPT comes here. |`-------------------------------------*/yyacceptlab: yyresult = 0; goto yyreturn;/*-----------------------------------.| yyabortlab -- YYABORT comes here. |`-----------------------------------*/yyabortlab: yyresult = 1; goto yyreturn;#ifndef yyoverflow/*-------------------------------------------------.| yyexhaustedlab -- memory exhaustion comes here. |`-------------------------------------------------*/yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */#endifyyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp); YYPOPSTACK (1); }#ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss);#endif#if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg);#endif /* Make sure YYID is used. */ return YYID (yyresult);}#line 174 "calc_yacc.y"Node * var_id(char *vs){ Node *p_node; p_node = (Node *)malloc(sizeof(Node)); p_node->node_data.id.s_label = vs; p_node->node_type = TYPE_EXPR_ID; return(p_node);}Node * con_cs(char *vs){ Node *p_node; p_node = (Node *)malloc(sizeof(Node)); p_node->node_data.cs.s_value = vs; p_node->node_type = TYPE_EXPR_CS; return(p_node);}Node * con_cc(char vc){ Node *p_node; p_node = (Node *)malloc(sizeof(Node)); p_node->node_data.cc.c_value = vc; p_node->node_type = TYPE_EXPR_CC; return(p_node);}Node * con_ci(long vi){ Node *p_node; p_node = (Node *)malloc(sizeof(Node)); p_node->node_data.ci.i_value = vi; p_node->node_type = TYPE_EXPR_CI; return(p_node);}Node * con_cr(Real vr){ Node *p_node; p_node = (Node *)malloc(sizeof(Node)); p_node->node_data.cr.r_value = vr; p_node->node_type = TYPE_EXPR_CR; return(p_node);}Node * ass_op(long op, char *va, Node *ex){ Node *p_node; p_node = (Node *)malloc(sizeof(Node)); p_node->node_data.op.oper = op; p_node->node_data.op.op_n = 2; p_node->node_data.op.op_s[0] = var_id(va); p_node->node_data.op.op_s[1] = ex; p_node->node_type = TYPE_EXPR_OP; return(p_node);}Node * exp_op(long op, long np, ...){ Node *p_node; va_list ap; int ai; p_node = (Node *)malloc(sizeof(Node)); va_start(ap, np); for(ai = 0; ai < np && ai < 4; ai ++) { p_node->node_data.op.op_s[ai] = va_arg(ap, Node *); } va_end(ap); p_node->node_data.op.oper = op; p_node->node_data.op.op_n = ai; p_node->node_type = TYPE_EXPR_OP; return(p_node);}void cc_cleanup(Node *p_node){ if(NULL != p_node) { if(TYPE_EXPR_OP == p_node->node_type) { int i; for(i = 0; i < p_node->node_data.op.op_n; i ++) { cc_cleanup(p_node->node_data.op.op_s[i]); } } else if(TYPE_EXPR_ID == p_node->node_type) { if(NULL != p_node->node_data.id.s_label) free(p_node->node_data.id.s_label); } else if(TYPE_EXPR_CS == p_node->node_type) { if(NULL != p_node->node_data.cs.s_value) free(p_node->node_data.cs.s_value); } free(p_node); }}long cc_builder(Node *p_node){ if(NULL != p_node) { switch(p_node->node_type) { case TYPE_EXPR_ID: fprintf(asout,"push_v %s\n", p_node->node_data.id.s_label); break; case TYPE_EXPR_CS: fprintf(asout,"push_s %s\n", p_node->node_data.cs.s_value); break; case TYPE_EXPR_CC: fprintf(asout,"push_c %c\n", p_node->node_data.cc.c_value); break; case TYPE_EXPR_CI: fprintf(asout,"push_i %d\n", p_node->node_data.ci.i_value); break; case TYPE_EXPR_CR: fprintf(asout,"push_r %e\n", p_node->node_data.cr.r_value); break; case TYPE_EXPR_OP: switch(p_node->node_data.op.oper) { 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(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -