void ffesymbol_error (ffesymbol s, ffelexToken t) { if ((t != NULL) && ffest_ffebad_start (FFEBAD_SYMERR)) { ffebad_string (ffesymbol_text (s)); ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t)); ffebad_here (1, ffesymbol_where_line (s), ffesymbol_where_column (s)); ffebad_finish (); } if (ffesymbol_attr (s, FFESYMBOL_attrANY)) return; ffesymbol_signal_change (s); /* May need to back up to previous version. */ if ((ffesymbol_attrs (s) & FFESYMBOL_attrsCBLOCK) || (ffesymbol_kind (s) == FFEINFO_kindNAMELIST)) ffebld_end_list (ffesymbol_ptr_to_listbottom (s)); ffesymbol_set_attr (s, FFESYMBOL_attrANY); ffesymbol_set_info (s, ffeinfo_new_any ()); ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD); if (s->check_state == FFESYMBOL_checkstatePENDING_) ffelex_token_kill (s->check_token); s->check_state = FFESYMBOL_checkstateCHECKED_; s = ffecom_sym_learned (s); ffesymbol_signal_unreported (s); }
static bool ffestu_symter_end_transition_ (ffebld expr) { ffesymbol symbol; bool any = FALSE; /* Label used for tail recursion (reset expr and go here instead of calling self). */ tail: /* :::::::::::::::::::: */ if (expr == NULL) return any; switch (ffebld_op (expr)) { case FFEBLD_opITEM: while (ffebld_trail (expr) != NULL) { if (ffestu_symter_end_transition_ (ffebld_head (expr))) any = TRUE; expr = ffebld_trail (expr); } expr = ffebld_head (expr); goto tail; /* :::::::::::::::::::: */ case FFEBLD_opSYMTER: symbol = ffecom_sym_end_transition (ffebld_symter (expr)); if ((symbol != NULL) && ffesymbol_attr (symbol, FFESYMBOL_attrANY)) any = TRUE; ffebld_set_info (expr, ffesymbol_info (symbol)); break; case FFEBLD_opANY: return TRUE; default: break; } switch (ffebld_arity (expr)) { case 2: if (ffestu_symter_end_transition_ (ffebld_left (expr))) any = TRUE; expr = ffebld_right (expr); goto tail; /* :::::::::::::::::::: */ case 1: expr = ffebld_left (expr); goto tail; /* :::::::::::::::::::: */ default: break; } return any; }