Пример #1
0
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);
}
Пример #2
0
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;
}