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); } ;