hi,
You know that treelang prescribes the function prototype must give the
storage class type explicitly, for an example, "external_definition
int add(int arg1, int arg2);"
I'd like to know how to modify the parse.y to let the storage type can
be implicitly and the default type is external_definition. Here is my
modification, but it's wrong, and bring the gcc into internal compiler
error. Can anyone give any suggestion? And I also want to how to debug
the modification.

Thanks.

--------Here is original code,-----------

function_prototype:
storage typename NAME LEFT_PARENTHESIS parameters RIGHT_PARENTHESIS SEMICOLON {
  struct prod_token_parm_item* tok;
  struct prod_token_parm_item *prod;
  struct prod_token_parm_item *type;
  struct prod_token_parm_item* first_parms;
  struct prod_token_parm_item* last_parms;
  struct prod_token_parm_item* this_parms;
  struct prod_token_parm_item *this_parm;
  struct prod_token_parm_item *this_parm_var;
  tok = $3;
  prod = make_production (PROD_FUNCTION_NAME, $3);
  SYMBOL_TABLE_NAME (prod) = $3;
  EXPRESSION_TYPE (prod) = $2;
  NUMERIC_TYPE (prod) = NUMERIC_TYPE (( (struct
prod_token_parm_item*)EXPRESSION_TYPE (prod)));
  PARAMETERS (prod) = reverse_prod_list ($5);
  insert_tree_name (prod);
  STORAGE_CLASS_TOKEN (prod) = $1;
  set_storage (prod);
  switch (STORAGE_CLASS (prod))
    {
    case STATIC_STORAGE:
    case EXTERNAL_DEFINITION_STORAGE:
      break;

    case AUTOMATIC_STORAGE:
      fprintf (stderr, "%s:%i:%i: A function cannot be automatic\n",
               tok->tp.tok.location.file,
               tok->tp.tok.location.line, tok->tp.tok.charno);
      print_token (stderr, 0, tok);
      errorcount++;
      YYERROR;
      break;

    default:
      abort ();
    }
  type = EXPRESSION_TYPE (prod);
  /* Create a parameter list in a non-front end specific format.  */
  for (first_parms = NULL, last_parms = NULL, this_parm = PARAMETERS (prod);
       this_parm;
       this_parm = this_parm->tp.pro.next)
    {
      if (this_parm->category != production_category)
        abort ();
      this_parm_var = VARIABLE (this_parm);
      if (!this_parm_var)
        abort ();
      if (this_parm_var->category != production_category)
        abort ();
      this_parms = my_malloc (sizeof (struct prod_token_parm_item));
      if (!this_parm_var->tp.pro.main_token)
        abort ();
      this_parms->tp.par.variable_name =
this_parm_var->tp.pro.main_token->tp.tok.chars;
      this_parms->category = parameter_category;
      this_parms->type = NUMERIC_TYPE
        (( (struct prod_token_parm_item*)EXPRESSION_TYPE (this_parm_var)));
      if (last_parms)
        {
          last_parms->tp.par.next = this_parms;
          last_parms = this_parms;
        }
      else
        {
          first_parms = this_parms;
          last_parms = this_parms;
        }
      this_parms->tp.par.where_to_put_var_tree =
        & (( (struct prod_token_parm_item*)VARIABLE (this_parm))->tp.pro.code);
    }
  FIRST_PARMS (prod) = first_parms;

  prod->tp.pro.code = tree_code_create_function_prototype
    (tok->tp.tok.chars, STORAGE_CLASS (prod), NUMERIC_TYPE (type),
     first_parms, tok->tp.tok.location);
}
;

--------Here is my code,----------

function_prototype:
storage typename NAME LEFT_PARENTHESIS parameters RIGHT_PARENTHESIS SEMICOLON {
  struct prod_token_parm_item* tok;
  struct prod_token_parm_item *prod;
  struct prod_token_parm_item *type;
  struct prod_token_parm_item* first_parms;
  struct prod_token_parm_item* last_parms;
  struct prod_token_parm_item* this_parms;
  struct prod_token_parm_item *this_parm;
  struct prod_token_parm_item *this_parm_var;
  tok = $3;
  prod = make_production (PROD_FUNCTION_NAME, $3);
  SYMBOL_TABLE_NAME (prod) = $3;
  EXPRESSION_TYPE (prod) = $2;
  NUMERIC_TYPE (prod) = NUMERIC_TYPE (( (struct
prod_token_parm_item*)EXPRESSION_TYPE (prod)));
  PARAMETERS (prod) = reverse_prod_list ($5);
  insert_tree_name (prod);
  STORAGE_CLASS_TOKEN (prod) = $1;
  set_storage (prod);
  switch (STORAGE_CLASS (prod))
    {
    case STATIC_STORAGE:
    case EXTERNAL_DEFINITION_STORAGE:
      break;

    case AUTOMATIC_STORAGE:
      fprintf (stderr, "%s:%i:%i: A function cannot be automatic\n",
               tok->tp.tok.location.file,
               tok->tp.tok.location.line, tok->tp.tok.charno);
      print_token (stderr, 0, tok);
      errorcount++;
      YYERROR;
      break;

    default:
      abort ();
    }
  type = EXPRESSION_TYPE (prod);
  /* Create a parameter list in a non-front end specific format.  */
  for (first_parms = NULL, last_parms = NULL, this_parm = PARAMETERS (prod);
       this_parm;
       this_parm = this_parm->tp.pro.next)
    {
      if (this_parm->category != production_category)
        abort ();
      this_parm_var = VARIABLE (this_parm);
      if (!this_parm_var)
        abort ();
      if (this_parm_var->category != production_category)
        abort ();
      this_parms = my_malloc (sizeof (struct prod_token_parm_item));
      if (!this_parm_var->tp.pro.main_token)
        abort ();
      this_parms->tp.par.variable_name =
this_parm_var->tp.pro.main_token->tp.tok.chars;
      this_parms->category = parameter_category;
      this_parms->type = NUMERIC_TYPE
        (( (struct prod_token_parm_item*)EXPRESSION_TYPE (this_parm_var)));
      if (last_parms)
        {
          last_parms->tp.par.next = this_parms;
          last_parms = this_parms;
        }
      else
        {
          first_parms = this_parms;
          last_parms = this_parms;
        }
      this_parms->tp.par.where_to_put_var_tree =
        & (( (struct prod_token_parm_item*)VARIABLE (this_parm))->tp.pro.code);
    }
  FIRST_PARMS (prod) = first_parms;

  prod->tp.pro.code = tree_code_create_function_prototype
    (tok->tp.tok.chars, STORAGE_CLASS (prod), NUMERIC_TYPE (type),
     first_parms, tok->tp.tok.location);
}
|typename NAME LEFT_PARENTHESIS parameters RIGHT_PARENTHESIS SEMICOLON {
  struct prod_token_parm_item* tok;
  struct prod_token_parm_item *prod;
  struct prod_token_parm_item *type;
  struct prod_token_parm_item* first_parms;
  struct prod_token_parm_item* last_parms;
  struct prod_token_parm_item* this_parms;
  struct prod_token_parm_item *this_parm;
  struct prod_token_parm_item *this_parm_var;
  struct prod_token_parm_item * stor;
  tok = $3;
  prod = make_production (PROD_FUNCTION_NAME, $2);
  SYMBOL_TABLE_NAME (prod) = $2;
  EXPRESSION_TYPE (prod) = $1;
  NUMERIC_TYPE (prod) = NUMERIC_TYPE (( (struct
prod_token_parm_item*)EXPRESSION_TYPE (prod)));
  PARAMETERS (prod) = reverse_prod_list ($4);
  insert_tree_name (prod);

  stor->category = token_category;
  stor->type = EXTERNAL_DEFINITION;
  stor->tp.tok.length = 19;
  stor->tp.tok.chars = "external_definition";

  STORAGE_CLASS_TOKEN (prod) = stor;
  set_storage (prod);
  switch (STORAGE_CLASS (prod))
    {
    case STATIC_STORAGE:
    case EXTERNAL_DEFINITION_STORAGE:
      break;

    case AUTOMATIC_STORAGE:
      fprintf (stderr, "%s:%i:%i: A function cannot be automatic\n",
               tok->tp.tok.location.file,
               tok->tp.tok.location.line, tok->tp.tok.charno);
      print_token (stderr, 0, tok);
      errorcount++;
      YYERROR;
      break;

    default:
      abort ();
    }
  type = EXPRESSION_TYPE (prod);
  /* Create a parameter list in a non-front end specific format.  */
  for (first_parms = NULL, last_parms = NULL, this_parm = PARAMETERS (prod);
       this_parm;
       this_parm = this_parm->tp.pro.next)
    {
      if (this_parm->category != production_category)
        abort ();
      this_parm_var = VARIABLE (this_parm);
      if (!this_parm_var)
        abort ();
      if (this_parm_var->category != production_category)
        abort ();
      this_parms = my_malloc (sizeof (struct prod_token_parm_item));
      if (!this_parm_var->tp.pro.main_token)
        abort ();
      this_parms->tp.par.variable_name =
this_parm_var->tp.pro.main_token->tp.tok.chars;
      this_parms->category = parameter_category;
      this_parms->type = NUMERIC_TYPE
        (( (struct prod_token_parm_item*)EXPRESSION_TYPE (this_parm_var)));
      if (last_parms)
        {
          last_parms->tp.par.next = this_parms;
          last_parms = this_parms;
        }
      else
        {
          first_parms = this_parms;
          last_parms = this_parms;
        }
      this_parms->tp.par.where_to_put_var_tree =
        & (( (struct prod_token_parm_item*)VARIABLE (this_parm))->tp.pro.code);
    }
  FIRST_PARMS (prod) = first_parms;

  prod->tp.pro.code = tree_code_create_function_prototype
    (tok->tp.tok.chars, STORAGE_CLASS (prod), NUMERIC_TYPE (type),
     first_parms, tok->tp.tok.location);
}
;

Reply via email to