📄 pass2.c
字号:
CALL(Pass2PutArg(scr, p1data->num[0])); /* assign type */ if (datain->code==COMP_REF_LOCAL_SYMBOL) { CALL(Pass2Put(scr, PASS2_ASSIGN_LOCAL_SYMBOL, datain, pass2_list, 5)); } else { if (datain->code==COMP_REF_GLOBAL_SYMBOL) { CALL(Pass2Put(scr, PASS2_ASSIGN_GLOBAL_SYMBOL, datain, pass2_list, 5)); } else { CALL(Pass2PutString(scr, datain->string, datain->strlen)); CALL(Pass2Put(scr, PASS2_ASSIGN_EXPORT_SYMBOL, datain, pass2_list, 5)); } } if (bracket_link_first.next) { CALL(Pass2Link(scr, pass2_list, bracket_link_first.next)); bracket_link_first.next=NULL; } p1data=p1data->next; /* eat assign */ if (p1data->code==COMP_START_OF_EXPR) p1data=p1data->next; /* eat begin of expression */ CALL(ParseExpression(scr, &p1data, pass2_list)); CALL(Pass2Put(scr, PASS2_END_OF_EXPR, p1data, pass2_list, 1)); } break; case COMP_OPEN_BRACKET: do { p1data=p1data->next; /* eat bracket */ CALL(Pass2Put(scr, PASS2_OPEN_BRACKET, p1data, &bracket_link, 1)); CALL(ParseExpression(scr, &p1data, &bracket_link)); CALL(Pass2Put(scr, PASS2_CLOSE_BRACKET, p1data, &bracket_link, 1)); } while (p1data->code==COMP_OPEN_BRACKET); stop=FALSE; break; default: CALL(Pass2PutArg(scr, datain->num[0])); /* put hash or local number */ if (datain->code==COMP_REF_LOCAL_SYMBOL) { CALL(Pass2Put(scr, PASS2_REF_LOCAL_SYMBOL, datain, pass2_list, 3)); } else { if (datain->code==COMP_REF_GLOBAL_SYMBOL) { CALL(Pass2Put(scr, PASS2_REF_GLOBAL_SYMBOL, datain, pass2_list, 3)); } else { CALL(Pass2PutString(scr, p1data->string, datain->strlen)); CALL(Pass2Put(scr, PASS2_REF_EXPORT_SYMBOL, datain, pass2_list, 3)); } } if (bracket_link_first.next) { CALL(Pass2Link(scr, pass2_list, bracket_link_first.next)); bracket_link_first.next=NULL; } switch(p1data->code) { case COMP_POSTINC: CALL(Pass2Put(scr, PASS2_POSTINC, p1data, pass2_list, 1)); p1data=p1data->next; /* eat me */ break; case COMP_POSTDEC: CALL(Pass2Put(scr, PASS2_POSTDEC, p1data, pass2_list, 1)); p1data=p1data->next; /* eat me */ break; } break; } } while (!stop); *p1datapek=p1data; return FPL_OK;}static ReturnCode ExamineLevel(struct Data *scr, struct Pass1Data **p1datapek, struct Pass2Data **pass2_list){ char stop=FALSE; ReturnCode ret; struct Pass1Data *p1data=*p1datapek; struct Pass2Data case_link_first, default_link_first; struct Pass2Data *case_link=&case_link_first; struct Pass2Data *default_link=&default_link_first; struct Pass2Data *initial_link=*pass2_list; default_link_first.next=NULL; case_link_first.next=NULL; if (level>max_level) max_level=level; do { switch(p1data->code) { case COMP_DECLARE: { struct Pass2Data *declare_link=&function_declare_link_first; struct Pass1Data *ingoingdata=p1data; long var_number; if (mainlevel==0) declare_link=&main_declare_link_first; CALL(Pass2PutArg(scr, p1data->num[0])); CALL(Pass2PutArg(scr, p1data->num[1])); var_number=p1data->num[1]; if (!(p1data->num[0]&FPL_EXPORT_SYMBOL)) { if (total_number_of_variables<var_number) total_number_of_variables=var_number; } CALL(Pass2PutString(scr, p1data->string, p1data->strlen)); while (declare_link->next && declare_link->next->num[0]<p1data->num[0]) declare_link=declare_link->next; CALL(Pass2Put(scr, PASS2_DECLARE, p1data, &declare_link, 0)); switch(p1data->next->code) { case COMP_ASSIGN: CALL(Pass2PutArg(scr, p1data->num[1])); CALL(Pass2PutArg(scr, p1data->next->num[0])); /* assign type */ if (p1data->num[0]&FPL_EXPORT_SYMBOL) { CALL(Pass2PutString(scr, p1data->string, p1data->strlen)); CALL(Pass2Put(scr, PASS2_ASSIGN_EXPORT_SYMBOL, p1data, pass2_list, 5)); } else { if (p1data->num[0]&FPL_GLOBAL_SYMBOL) { CALL(Pass2PutString(scr, p1data->string, p1data->strlen)); CALL(Pass2Put(scr, PASS2_ASSIGN_GLOBAL_SYMBOL, p1data, pass2_list, 5)); } else { CALL(Pass2Put(scr, PASS2_ASSIGN_LOCAL_SYMBOL, p1data, pass2_list, 5)); } } p1data=p1data->next; /* eat declare */ p1data=p1data->next; /* eat assign */ p1data=p1data->next; /* eat begin of expression */ CALL(ParseExpression(scr, &p1data, pass2_list)); CALL(Pass2Put(scr, PASS2_END_OF_EXPR, p1data, pass2_list, 1)); break; case COMP_OPEN_BRACKET: /* [ */ CALL(Pass2PutArg(scr, p1data->num[1])); if (p1data->num[0]&FPL_EXPORT_SYMBOL) { CALL(Pass2PutString(scr, p1data->string, p1data->strlen)); CALL(Pass2Put(scr, PASS2_REF_EXPORT_SYMBOL, p1data, pass2_list, 3)); } else { if (p1data->num[0]&FPL_GLOBAL_SYMBOL) { CALL(Pass2PutString(scr, p1data->string, p1data->strlen)); CALL(Pass2Put(scr, PASS2_REF_GLOBAL_SYMBOL, p1data, pass2_list, 3)); } else { CALL(Pass2Put(scr, PASS2_REF_LOCAL_SYMBOL, p1data, pass2_list, 3)); } } p1data=p1data->next; /* eat declare */ CALL(Pass2Put(scr, PASS2_RESIZE, p1data, pass2_list, 1)); do { p1data=p1data->next; /* eat bracket */ CALL(Pass2Put(scr, PASS2_OPEN_BRACKET, p1data, pass2_list, 1)); CALL(ParseExpression(scr, &p1data, pass2_list)); CALL(Pass2Put(scr, PASS2_CLOSE_BRACKET, p1data, pass2_list, 1)); } while (p1data->code==COMP_OPEN_BRACKET); if (p1data->code==COMP_ASSIGN) { CALL(Pass2PutArg(scr, ingoingdata->num[1])); CALL(Pass2PutArg(scr, p1data->num[0])); /* assign type */ if (ingoingdata->num[0]&FPL_EXPORT_SYMBOL) { CALL(Pass2PutString(scr, ingoingdata->string, ingoingdata->strlen)); CALL(Pass2Put(scr, PASS2_ASSIGN_EXPORT_SYMBOL, ingoingdata, pass2_list, 5)); } else { if (ingoingdata->num[0]&FPL_GLOBAL_SYMBOL) { CALL(Pass2Put(scr, PASS2_ASSIGN_GLOBAL_SYMBOL, ingoingdata, pass2_list, 5)); } else { CALL(Pass2Put(scr, PASS2_ASSIGN_LOCAL_SYMBOL, ingoingdata, pass2_list, 5)); } } p1data=p1data->next; /* eat assign */ CALL(ParseExpression(scr, &p1data, pass2_list)); CALL(Pass2Put(scr, PASS2_END_OF_EXPR, p1data, pass2_list, 1)); } break; default: { long type=p1data->num[0]; p1data=p1data->next; /* eat declare */ if (!(type&(FPL_EXPORT_SYMBOL|FPL_GLOBAL_SYMBOL))) { CALL(Pass2PutArg(scr, var_number)); CALL(Pass2Put(scr, PASS2_RESET_VARIABLE, p1data, pass2_list, 3)); } } } } break; case COMP_END_OF_DECLARE: /* end of allowed declaration phase */ p1data=p1data->next; /* eat END OF DECLARE */ break; case COMP_FUNCTION_DECLARE: { struct Pass2Data *declare_link=&main_declare_link_first; long argument_count=0; while (declare_link->next && declare_link->next->num[0]<p1data->num[0]) declare_link=declare_link->next; if (p1data->num[0]&FPL_EXPORT_SYMBOL) { long label=labelcount; labelcount++; CALL(Pass2PutArg(scr, label)); CALL(Pass2Put(scr, PASS2_LABEL, p1data, &function_contain_link, 0)); CALL(Pass2PutString(scr, p1data->string, p1data->strlen)); CALL(Pass2PutArg(scr, p1data->num[0])); CALL(Pass2PutArg(scr, label)); CALL(Pass2PutArg(scr, p1data->num[1])); p1data=p1data->next; /* eat function declare */ CALL(Pass2PutString(scr, p1data->string, p1data->strlen)); /* put param list */ CALL(Pass2Put(scr, PASS2_EXPORT_FUNCTION, p1data, &declare_link, 9)); p1data=p1data->next; /* eat parameter list */ } else { if (total_number_of_functions<p1data->num[1]) total_number_of_functions=p1data->num[1]; CALL(Pass2PutString(scr, p1data->string, p1data->strlen)); CALL(Pass2PutArg(scr, p1data->num[1])); CALL(Pass2Put(scr, PASS2_FUNCTION_START, p1data, &function_contain_link, 0));/* CALL(Pass2PutString(scr, p1data->string, p1data->strlen)); CALL(Pass2PutArg(scr, p1data->num[0])); CALL(Pass2PutArg(scr, p1data->num[1])); CALL(Pass2PutArg(scr, (long)*pass2_list)); CALL(Pass2Put(scr, PASS2_LOCAL_FUNCTION, p1data, &declare_link, 0));*/ p1data=p1data->next; /* eat function declare */ p1data=p1data->next; /* eat parameter list */ } function_start=function_contain_link; p1data=p1data->next; /* eat open paren */ while (p1data->code!=COMP_CLOSE_PAREN) { declare_link=&function_declare_link_first; CALL(Pass2PutArg(scr, p1data->num[0])); CALL(Pass2PutArg(scr, p1data->num[1])); if (total_number_of_variables<p1data->num[1]) total_number_of_variables=p1data->num[1]; CALL(Pass2PutString(scr, p1data->string, p1data->strlen)); while (declare_link->next && declare_link->next->num[0]<p1data->num[0]) declare_link=declare_link->next; CALL(Pass2Put(scr, PASS2_DECLARE, p1data, &declare_link, 0)); CALL(Pass2PutArg(scr, p1data->num[1])); CALL(Pass2PutArg(scr, argument_count++)); CALL(Pass2Put(scr, PASS2_ASSIGN_ARGUMENT, p1data, &function_contain_link, 5)); p1data=p1data->next; /* eat declaration */ } p1data=p1data->next; /* eat close paren */ if (p1data->code==COMP_OPEN_BRACE) { p1data=p1data->next; /* eat me */ mainlevel++; CALL(ExamineLevel(scr, &p1data, &function_contain_link)); /* examine level */ mainlevel--; } } break; case COMP_MAIN_START: main_label_number=labelcount; labelcount++; mainlevel++; CALL(Pass2PutArg(scr, main_label_number)); CALL(Pass2Put(scr, PASS2_LABEL, p1data, pass2_list, 0)); function_start=*pass2_list; /* Falling down */ case COMP_OPEN_BRACE: p1data=p1data->next; /* eat me */ CALL(ExamineLevel(scr, &p1data, pass2_list)); /* examine level */ break; case COMP_MAIN_END: CALL(Pass2Put(scr, PASS2_EXIT, p1data, pass2_list, 1)); CALL(Pass2Put(scr, PASS2_END_OF_EXPR, p1data, pass2_list, 1));#if 0 if (function_declare_link_first.next) { CALL(Pass2Link(scr, &function_start, function_declare_link_first.next)); } function_declare_link=&function_declare_link_first; function_declare_link_first.next=NULL;#endif { struct Pass2Data *declare_link=&main_declare_link_first; while (declare_link->next) declare_link=declare_link->next; CALL(Pass2PutArg(scr, main_label_number)); CALL(Pass2Put(scr, PASS2_MAIN_START, p1data, &declare_link, 3));#if 0 if (main_declare_link_first.next) { struct Pass2Data *temp=&pass2_first_data; CALL(Pass2Link(scr, &temp, main_declare_link_first.next)); main_declare_link_first.next=NULL; }#endif CALL(Pass2Put(scr, PASS2_MAIN_END, p1data, pass2_list, 0));#if 0 if (function_contain_link_first.next) { CALL(Pass2Link(scr, pass2_list, function_contain_link_first.next)); function_contain_link_first.next=NULL; }#endif CALL(Pass2Put(scr, PASS2_MAIN_END, p1data, pass2_list, 0)); CALL(Pass2Put(scr, PASS2_MAIN_END, p1data, pass2_list, 0)); CALL(Pass2Put(scr, PASS2_MAIN_END, p1data, pass2_list, 0)); } p1data=p1data->next; /* eat me */ break; case COMP_END_OF_FUNCTION: CALL(Pass2Put(scr, PASS2_RETURN, p1data, &function_contain_link, 1)); CALL(Pass2Put(scr, PASS2_END_OF_EXPR, p1data, &function_contain_link, 1)); CALL(Pass2Put(scr, PASS2_END_OF_FUNCTION, p1data, &function_contain_link, 0)); p1data=p1data->next; /* eat me */ if (function_declare_link_first.next) { CALL(Pass2Link(scr, &function_start, function_declare_link_first.next)); } function_declare_link=&function_declare_link_first; function_declare_link_first.next=NULL; break; case COMP_CLOSE_BRACE: stop=TRUE; p1data=p1data->next; /* eat me */ break; case COMP_AMOUNT_VARIABLES: CALL(Pass2PutArg(scr, p1data->num[0])); CALL(Pass2Put(scr, PASS2_AMOUNT_VARIABLES, p1data, pass2_list, 0)); p1data=p1data->next; /* eat me */ break; case COMP_IF: { long label=labelcount; labelcount+=2; p1data=p1data->next; /* Eat and forget IF */ CALL(Pass2PutArg(scr, label)); CALL(Pass2Put(scr, PASS2_IFNOT_BRANCH_ELSE, p1data, pass2_list, 3)); p1data=p1data->next; /* Eat begin of expression */ CALL(ParseExpression(scr, &p1data, pass2_list));/* repeat command */ CALL(Pass2Put(scr, PASS2_END_OF_EXPR, p1data, pass2_list, 1)); /* together with IFNOT */ p1data=p1data->next; /* Eat open brace */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -