simplify the handling of <> and <*>'s code_props.

Currently they are treated in separated variables, contrary to other
<TYPE> code_props.  This duplicates code (and messages for translators)
uselessly, as demonstrated by the fact that thanks to this patch, now
useless <*> and <> code_props are reported like the others.

* src/parse-gram.y (generic_symlist_item): Treat "<*>" and "<>" as regular
type tags.
* src/symlist.h, src/symlist.c (symbol_list_default_tagged_new)
(symbol_list_default_tagless_new,SYMLIST_DEFAULT_TAGGED)
(SYMLIST_DEFAULT_TAGLESS): Remove.
* src/symtab.h, src/symtab.c (default_tagged_code_props)
(default_tagless_code_props, default_tagged_code_props_set)
(default_tagless_code_props_set): Remove.
(symbol_code_props_get): Default to <*> or <>'s code_props.

* tests/actions.at: Complete expected errors: there are new warnings.
* tests/input.at: Likewise.
(Useless printers or destructors): Extend.
This commit is contained in:
Akim Demaille
2012-07-22 17:51:25 +02:00
parent 70946cff5e
commit 9534d2be80
7 changed files with 93 additions and 149 deletions

View File

@@ -523,8 +523,8 @@ generic_symlist:
generic_symlist_item:
symbol { $$ = symbol_list_sym_new ($1, @1); }
| TAG { $$ = symbol_list_type_new ($1, @1); }
| "<*>" { $$ = symbol_list_default_tagged_new (@1); }
| "<>" { $$ = symbol_list_default_tagless_new (@1); }
| "<*>" { $$ = symbol_list_type_new ("*", @1); }
| "<>" { $$ = symbol_list_type_new ("", @1); }
;
/* One token definition. */

View File

@@ -78,42 +78,6 @@ symbol_list_type_new (uniqstr type_name, location loc)
}
/*----------------------------------------.
| Create a list containing a <*> at LOC. |
`----------------------------------------*/
symbol_list *
symbol_list_default_tagged_new (location loc)
{
symbol_list *res = xmalloc (sizeof *res);
res->content_type = SYMLIST_DEFAULT_TAGGED;
res->location = res->sym_loc = loc;
res->named_ref = NULL;
res->next = NULL;
return res;
}
/*---------------------------------------.
| Create a list containing a <> at LOC. |
`---------------------------------------*/
symbol_list *
symbol_list_default_tagless_new (location loc)
{
symbol_list *res = xmalloc (sizeof *res);
res->content_type = SYMLIST_DEFAULT_TAGLESS;
res->location = res->sym_loc = loc;
res->named_ref = NULL;
res->next = NULL;
return res;
}
/*-----------------------------------------------------------------------.
| Print this list, for which every content_type must be SYMLIST_SYMBOL. |
`-----------------------------------------------------------------------*/
@@ -247,11 +211,5 @@ symbol_list_code_props_set (symbol_list *node, code_props_type kind,
if (node->content.sem_type->status == undeclared)
node->content.sem_type->status = used;
break;
case SYMLIST_DEFAULT_TAGGED:
default_tagged_code_props_set (kind, &cprops);
break;
case SYMLIST_DEFAULT_TAGLESS:
default_tagless_code_props_set (kind, &cprops);
break;
}
}

View File

@@ -34,8 +34,8 @@ typedef struct symbol_list
* \c <>.
*/
enum {
SYMLIST_SYMBOL, SYMLIST_TYPE,
SYMLIST_DEFAULT_TAGGED, SYMLIST_DEFAULT_TAGLESS
SYMLIST_SYMBOL,
SYMLIST_TYPE
} content_type;
union {
/**
@@ -88,11 +88,6 @@ symbol_list *symbol_list_sym_new (symbol *sym, location loc);
/** Create a list containing \c type_name at \c loc. */
symbol_list *symbol_list_type_new (uniqstr type_name, location loc);
/** Create a list containing a \c <*> at \c loc. */
symbol_list *symbol_list_default_tagged_new (location loc);
/** Create a list containing a \c <> at \c loc. */
symbol_list *symbol_list_default_tagless_new (location loc);
/** Print this list.
\pre For every node \c n in the list, <tt>n->content_type =

View File

@@ -46,20 +46,6 @@ symbol *accept = NULL;
symbol *startsymbol = NULL;
location startsymbol_location;
/*---------------------------------------.
| Default %destructor's and %printer's. |
`---------------------------------------*/
static code_props default_tagged_code_props[CODE_PROPS_SIZE] =
{
CODE_PROPS_NONE_INIT,
CODE_PROPS_NONE_INIT,
};
static code_props default_tagless_code_props[CODE_PROPS_SIZE] =
{
CODE_PROPS_NONE_INIT,
CODE_PROPS_NONE_INIT,
};
/*---------------------------------.
| Create a new symbol, named TAG. |
@@ -291,12 +277,14 @@ symbol_code_props_get (symbol *sym, code_props_type kind)
}
/* Apply default code props's only to user-defined symbols. */
if (sym->tag[0] == '$' || sym == errtoken)
return &code_props_none;
if (sym->type_name)
return &default_tagged_code_props[kind];
return &default_tagless_code_props[kind];
if (sym->tag[0] != '$' && sym != errtoken)
{
code_props *code =
&semantic_type_get (sym->type_name ? "*" : "", NULL)->props[kind];
if (code->code)
return code;
}
return &code_props_none;
}
/*-----------------------------------------------------------------.
@@ -437,7 +425,10 @@ symbol_check_defined (symbol *sym)
static inline bool
semantic_type_check_defined (semantic_type *sem_type)
{
if (sem_type->status == declared)
// <*> and <> do not have to be "declared".
if (sem_type->status == declared
|| !*sem_type->tag
|| STREQ(sem_type->tag, "*"))
{
for (int i = 0; i < 2; ++i)
if (sem_type->props[i].kind != CODE_PROPS_NONE
@@ -970,36 +961,3 @@ symbols_pack (void)
_("the start symbol %s is a token"),
startsymbol->tag);
}
/*--------------------------------------------------.
| Set default tagged/tagless %destructor/%printer. |
`--------------------------------------------------*/
void
default_tagged_code_props_set (code_props_type kind, code_props const *code)
{
if (default_tagged_code_props[kind].code)
{
complain_at (code->location, complaint,
_("redeclaration for default tagged %s"),
code_props_type_string (kind));
complain_at (default_tagged_code_props[kind].location, complaint,
_("previous declaration"));
}
default_tagged_code_props[kind] = *code;
}
void
default_tagless_code_props_set (code_props_type kind, code_props const *code)
{
if (default_tagless_code_props[kind].code)
{
complain_at (code->location, complaint,
_("redeclaration for default tagless %s"),
code_props_type_string (kind));
complain_at (default_tagless_code_props[kind].location, complaint,
_("previous declaration"));
}
default_tagless_code_props[kind] = *code;
}

View File

@@ -277,16 +277,4 @@ void symbols_check_defined (void);
#token_translations. */
void symbols_pack (void);
/*---------------------------------------.
| Default %destructor's and %printer's. |
`---------------------------------------*/
/** Set the default \c \%destructor or \c \%printer for tagged values. */
void default_tagged_code_props_set (code_props_type kind,
code_props const *code);
/** Set the default \c \%destructor or \c \%printer for tagless values. */
void default_tagless_code_props_set (code_props_type kind,
code_props const *destructor);
#endif /* !SYMTAB_H_ */