📄 stu.c
字号:
ffesymbolffestu_sym_exec_transition (ffesymbol s){ ffeinfoKind skd; ffeinfoWhere swh; ffeinfoKind nkd; ffeinfoWhere nwh; ffesymbolAttrs sa; ffesymbolAttrs na; ffesymbolState ss; ffesymbolState ns; ffeintrinGen gen; ffeintrinSpec spec; ffeintrinImp imp; bool needs_type = TRUE; /* Implicit type assignment might be necessary. */ bool resolve_intrin = TRUE; /* Might need to resolve intrinsic. */ assert (s != NULL); sa = ffesymbol_attrs (s); skd = ffesymbol_kind (s); swh = ffesymbol_where (s); ss = ffesymbol_state (s); switch (ss) { case FFESYMBOL_stateNONE: return s; /* Assume caller will handle it. */ case FFESYMBOL_stateSEEN: break; case FFESYMBOL_stateUNCERTAIN: ffestorag_exec_layout (s); return s; /* Already processed this one, or not necessary. */ case FFESYMBOL_stateUNDERSTOOD: if (skd == FFEINFO_kindNAMELIST) { ffebld_end_list (ffesymbol_ptr_to_listbottom (s)); ffestu_list_exec_transition_ (ffesymbol_namelist (s)); } else if ((swh == FFEINFO_whereLOCAL) && ((skd == FFEINFO_kindFUNCTION) || (skd == FFEINFO_kindSUBROUTINE))) { ffestu_dummies_transition_ (ffecom_sym_exec_transition, ffesymbol_dummyargs (s)); if ((skd == FFEINFO_kindFUNCTION) && !ffeimplic_establish_symbol (s)) ffesymbol_error (s, ffesta_tokens[0]); } ffesymbol_reference (s, NULL, FALSE); ffestorag_exec_layout (s); ffesymbol_signal_unreported (s); /* For debugging purposes. */ return s; default: assert ("bad status" == NULL); return s; } ns = FFESYMBOL_stateUNDERSTOOD; /* Only a few UNCERTAIN exceptions. */ na = sa; nkd = skd; nwh = swh; assert (!(sa & FFESYMBOL_attrsANY)); if (sa & FFESYMBOL_attrsCOMMON) { assert (!(sa & ~(FFESYMBOL_attrsADJUSTS | FFESYMBOL_attrsARRAY | FFESYMBOL_attrsCOMMON | FFESYMBOL_attrsEQUIV | FFESYMBOL_attrsINIT | FFESYMBOL_attrsNAMELIST | FFESYMBOL_attrsSFARG | FFESYMBOL_attrsTYPE))); nkd = FFEINFO_kindENTITY; nwh = FFEINFO_whereCOMMON; } else if (sa & FFESYMBOL_attrsRESULT) { /* Result variable for function. */ assert (!(sa & ~(FFESYMBOL_attrsANYLEN | FFESYMBOL_attrsRESULT | FFESYMBOL_attrsSFARG | FFESYMBOL_attrsTYPE))); nkd = FFEINFO_kindENTITY; nwh = FFEINFO_whereRESULT; } else if (sa & FFESYMBOL_attrsSFUNC) { /* Statement function. */ assert (!(sa & ~(FFESYMBOL_attrsSFUNC | FFESYMBOL_attrsTYPE))); nkd = FFEINFO_kindFUNCTION; nwh = FFEINFO_whereCONSTANT; } else if (sa & FFESYMBOL_attrsEXTERNAL) { assert (!(sa & ~(FFESYMBOL_attrsDUMMY | FFESYMBOL_attrsEXTERNAL | FFESYMBOL_attrsTYPE))); if (sa & FFESYMBOL_attrsTYPE) { nkd = FFEINFO_kindFUNCTION; if (sa & FFESYMBOL_attrsDUMMY) nwh = FFEINFO_whereDUMMY; else { if (ffesta_is_entry_valid) { nwh = FFEINFO_whereNONE; /* DUMMY, GLOBAL. */ ns = FFESYMBOL_stateUNCERTAIN; } else nwh = FFEINFO_whereGLOBAL; } } else /* No TYPE. */ { nkd = FFEINFO_kindNONE; /* FUNCTION, SUBROUTINE, BLOCKDATA. */ needs_type = FALSE; /* Only gets type if FUNCTION. */ ns = FFESYMBOL_stateUNCERTAIN; if (sa & FFESYMBOL_attrsDUMMY) nwh = FFEINFO_whereDUMMY; /* Not BLOCKDATA. */ else { if (ffesta_is_entry_valid) nwh = FFEINFO_whereNONE; /* DUMMY, GLOBAL. */ else nwh = FFEINFO_whereGLOBAL; } } } else if (sa & FFESYMBOL_attrsDUMMY) { assert (!(sa & FFESYMBOL_attrsEXTERNAL)); /* Handled above. */ assert (!(sa & ~(FFESYMBOL_attrsADJUSTABLE /* Possible. */ | FFESYMBOL_attrsADJUSTS /* Possible. */ | FFESYMBOL_attrsANYLEN /* Possible. */ | FFESYMBOL_attrsANYSIZE /* Possible. */ | FFESYMBOL_attrsARRAY /* Possible. */ | FFESYMBOL_attrsDUMMY /* Have it. */ | FFESYMBOL_attrsEXTERNAL | FFESYMBOL_attrsSFARG /* Possible. */ | FFESYMBOL_attrsTYPE))); /* Possible. */ nwh = FFEINFO_whereDUMMY; if (ffestu_symter_exec_transition_ (ffesymbol_dims (s))) na = FFESYMBOL_attrsetNONE; if (sa & (FFESYMBOL_attrsADJUSTS | FFESYMBOL_attrsARRAY | FFESYMBOL_attrsANYLEN | FFESYMBOL_attrsNAMELIST | FFESYMBOL_attrsSFARG)) nkd = FFEINFO_kindENTITY; else if (sa & FFESYMBOL_attrsDUMMY) /* Still okay. */ { if (!(sa & FFESYMBOL_attrsTYPE)) needs_type = FALSE; /* Don't assign type to SUBROUTINE! */ nkd = FFEINFO_kindNONE; /* ENTITY, FUNCTION, SUBROUTINE. */ ns = FFESYMBOL_stateUNCERTAIN; } } else if (sa & FFESYMBOL_attrsADJUSTS) { /* Must be DUMMY or COMMON at some point. */ assert (!(sa & (FFESYMBOL_attrsCOMMON | FFESYMBOL_attrsDUMMY))); /* Handled above. */ assert (!(sa & ~(FFESYMBOL_attrsADJUSTS /* Have it. */ | FFESYMBOL_attrsCOMMON | FFESYMBOL_attrsDUMMY | FFESYMBOL_attrsEQUIV /* Possible. */ | FFESYMBOL_attrsINIT /* Possible. */ | FFESYMBOL_attrsNAMELIST /* Possible. */ | FFESYMBOL_attrsSFARG /* Possible. */ | FFESYMBOL_attrsTYPE))); /* Possible. */ nkd = FFEINFO_kindENTITY; if (sa & FFESYMBOL_attrsEQUIV) { if ((ffesymbol_equiv (s) == NULL) || (ffeequiv_common (ffesymbol_equiv (s)) == NULL)) na = FFESYMBOL_attrsetNONE; /* Not equiv'd into COMMON. */ else nwh = FFEINFO_whereCOMMON; } else if (!ffesta_is_entry_valid || (sa & (FFESYMBOL_attrsINIT | FFESYMBOL_attrsNAMELIST))) na = FFESYMBOL_attrsetNONE; else nwh = FFEINFO_whereDUMMY; } else if (sa & FFESYMBOL_attrsSAVE) { assert (!(sa & ~(FFESYMBOL_attrsARRAY | FFESYMBOL_attrsEQUIV | FFESYMBOL_attrsINIT | FFESYMBOL_attrsNAMELIST | FFESYMBOL_attrsSAVE | FFESYMBOL_attrsSFARG | FFESYMBOL_attrsTYPE))); nkd = FFEINFO_kindENTITY; nwh = FFEINFO_whereLOCAL; } else if (sa & FFESYMBOL_attrsEQUIV) { assert (!(sa & FFESYMBOL_attrsCOMMON)); /* Handled above. */ assert (!(sa & ~(FFESYMBOL_attrsADJUSTS /* Possible. */ | FFESYMBOL_attrsARRAY /* Possible. */ | FFESYMBOL_attrsCOMMON | FFESYMBOL_attrsEQUIV /* Have it. */ | FFESYMBOL_attrsINIT /* Possible. */ | FFESYMBOL_attrsNAMELIST /* Possible. */ | FFESYMBOL_attrsSAVE /* Possible. */ | FFESYMBOL_attrsSFARG /* Possible. */ | FFESYMBOL_attrsTYPE))); /* Possible. */ nkd = FFEINFO_kindENTITY; nwh = ffestu_equiv_ (s); } else if (sa & FFESYMBOL_attrsNAMELIST) { assert (!(sa & (FFESYMBOL_attrsADJUSTS | FFESYMBOL_attrsCOMMON | FFESYMBOL_attrsEQUIV | FFESYMBOL_attrsSAVE))); /* Handled above. */ assert (!(sa & ~(FFESYMBOL_attrsADJUSTS | FFESYMBOL_attrsARRAY /* Possible. */ | FFESYMBOL_attrsCOMMON | FFESYMBOL_attrsEQUIV | FFESYMBOL_attrsINIT /* Possible. */ | FFESYMBOL_attrsNAMELIST /* Have it. */ | FFESYMBOL_attrsSAVE | FFESYMBOL_attrsSFARG /* Possible. */ | FFESYMBOL_attrsTYPE))); /* Possible. */ nkd = FFEINFO_kindENTITY; nwh = FFEINFO_whereLOCAL; } else if (sa & FFESYMBOL_attrsINIT) { assert (!(sa & (FFESYMBOL_attrsADJUSTS | FFESYMBOL_attrsCOMMON | FFESYMBOL_attrsEQUIV | FFESYMBOL_attrsNAMELIST | FFESYMBOL_attrsSAVE))); /* Handled above. */ assert (!(sa & ~(FFESYMBOL_attrsADJUSTS | FFESYMBOL_attrsARRAY /* Possible. */ | FFESYMBOL_attrsCOMMON | FFESYMBOL_attrsEQUIV | FFESYMBOL_attrsINIT /* Have it. */ | FFESYMBOL_attrsNAMELIST | FFESYMBOL_attrsSAVE | FFESYMBOL_attrsSFARG /* Possible. */ | FFESYMBOL_attrsTYPE))); /* Possible. */ nkd = FFEINFO_kindENTITY; nwh = FFEINFO_whereLOCAL; } else if (sa & FFESYMBOL_attrsSFARG) { assert (!(sa & (FFESYMBOL_attrsADJUSTS | FFESYMBOL_attrsCOMMON | FFESYMBOL_attrsDUMMY | FFESYMBOL_attrsEQUIV | FFESYMBOL_attrsINIT | FFESYMBOL_attrsNAMELIST | FFESYMBOL_attrsRESULT | FFESYMBOL_attrsSAVE))); /* Handled above. */ assert (!(sa & ~(FFESYMBOL_attrsADJUSTS | FFESYMBOL_attrsCOMMON | FFESYMBOL_attrsDUMMY | FFESYMBOL_attrsEQUIV | FFESYMBOL_attrsINIT | FFESYMBOL_attrsNAMELIST | FFESYMBOL_attrsRESULT | FFESYMBOL_attrsSAVE | FFESYMBOL_attrsSFARG /* Have it. */ | FFESYMBOL_attrsTYPE))); /* Possible. */ nkd = FFEINFO_kindENTITY; if (ffesta_is_entry_valid) { nwh = FFEINFO_whereNONE; /* DUMMY, LOCAL. */ ns = FFESYMBOL_stateUNCERTAIN; } else nwh = FFEINFO_whereLOCAL; } else if (sa & (FFESYMBOL_attrsADJUSTABLE | FFESYMBOL_attrsANYSIZE)) { assert (!(sa & ~(FFESYMBOL_attrsADJUSTABLE | FFESYMBOL_attrsANYLEN | FFESYMBOL_attrsANYSIZE | FFESYMBOL_attrsARRAY | FFESYMBOL_attrsTYPE))); nkd = FFEINFO_kindENTITY; if (ffestu_symter_exec_transition_ (ffesymbol_dims (s))) na = FFESYMBOL_attrsetNONE; if (sa & (FFESYMBOL_attrsANYLEN | FFESYMBOL_attrsANYSIZE)) nwh = FFEINFO_whereDUMMY; else if (sa & (FFESYMBOL_attrsADJUSTABLE | FFESYMBOL_attrsANYSIZE)) /* Still okay. */ { nwh = FFEINFO_whereNONE; /* DUMMY, LOCAL. */ ns = FFESYMBOL_stateUNCERTAIN; } } else if (sa & FFESYMBOL_attrsARRAY) { assert (!(sa & (FFESYMBOL_attrsADJUSTABLE | FFESYMBOL_attrsANYSIZE | FFESYMBOL_attrsCOMMON | FFESYMBOL_attrsDUMMY | FFESYMBOL_attrsEQUIV | FFESYMBOL_attrsINIT | FFESYMBOL_attrsNAMELIST | FFESYMBOL_attrsSAVE))); /* Handled above. */ assert (!(sa & ~(FFESYMBOL_attrsADJUSTABLE | FFESYMBOL_attrsANYLEN /* Possible. */ | FFESYMBOL_attrsANYSIZE | FFESYMBOL_attrsARRAY /* Have it. */ | FFESYMBOL_attrsCOMMON | FFESYMBOL_attrsDUMMY | FFESYMBOL_attrsEQUIV | FFESYMBOL_attrsINIT | FFESYMBOL_attrsNAMELIST | FFESYMBOL_attrsSAVE | FFESYMBOL_attrsTYPE))); /* Possible. */ nkd = FFEINFO_kindENTITY; if (sa & FFESYMBOL_attrsANYLEN) { assert (ffesta_is_entry_valid); /* Already diagnosed. */ nwh = FFEINFO_whereDUMMY; } else { if (ffesta_is_entry_valid) { nwh = FFEINFO_whereNONE; /* DUMMY, LOCAL. */ ns = FFESYMBOL_stateUNCERTAIN; } else nwh = FFEINFO_whereLOCAL; } } else if (sa & FFESYMBOL_attrsANYLEN) { assert (!(sa & (FFESYMBOL_attrsADJUSTABLE | FFESYMBOL_attrsANYSIZE | FFESYMBOL_attrsARRAY | FFESYMBOL_attrsDUMMY | FFESYMBOL_attrsRESULT))); /* Handled above. */ assert (!(sa & ~(FFESYMBOL_attrsADJUSTABLE | FFESYMBOL_attrsANYLEN /* Have it. */ | FFESYMBOL_attrsANYSIZE | FFESYMBOL_attrsARRAY | FFESYMBOL_attrsDUMMY | FFESYMBOL_attrsRESULT | FFESYMBOL_attrsTYPE))); /* Have it too. */ if (ffesta_is_entry_valid) { nkd = FFEINFO_kindNONE; /* ENTITY, FUNCTION. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -