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. |
fprintf (f, " %s { %s }", #Attr, s->props[Attr].code)
void
-symbol_print (symbol *s, FILE *f)
+symbol_print (symbol const *s, FILE *f)
{
if (s)
{
symbol_redeclaration (symbol *s, const char *what, location first,
location second)
{
- complain_at (second, complaint, _("%s redeclaration for %s"), what, s->tag);
- complain_at (first, complaint, _("previous declaration"));
+ unsigned i = 0;
+ complain_at_indent (second, complaint, &i,
+ _("%s redeclaration for %s"), what, s->tag);
+ i += SUB_INDENT;
+ complain_at_indent (first, complaint, &i,
+ _("previous declaration"));
}
static void
semantic_type_redeclaration (semantic_type *s, const char *what, location first,
location second)
{
- complain_at (second, complaint, _("%s redeclaration for <%s>"), what, s->tag);
- complain_at (first, complaint, _("previous declaration"));
+ unsigned i = 0;
+ complain_at_indent (second, complaint, &i,
+ _("%s redeclaration for <%s>"), what, s->tag);
+ i += SUB_INDENT;
+ complain_at_indent (first, complaint, &i,
+ _("previous declaration"));
}
| Get the computed %destructor or %printer for SYM. |
`---------------------------------------------------*/
-code_props const *
-symbol_code_props_get (symbol const *sym,
- code_props_type kind)
+code_props *
+symbol_code_props_get (symbol *sym, code_props_type kind)
{
/* Per-symbol code props. */
if (sym->props[kind].code)
/* Per-type code props. */
if (sym->type_name)
{
- code_props const *code =
+ code_props *code =
&semantic_type_get (sym->type_name, NULL)->props[kind];
if (code->code)
return code;
}
/* 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;
}
/*-----------------------------------------------------------------.
{
if (sym->class == unknown_sym)
{
- switch (sym->status)
- {
- case used:
- complain_at (sym->location, Wother,
- _("symbol %s is used, but is not defined as a token"
- " and has no rules"),
- sym->tag);
- break;
- case undeclared:
- case needed:
- complain_at (sym->location, complaint,
- _("symbol %s is used, but is not defined as a token"
- " and has no rules"),
- sym->tag);
- break;
- case declared:
- /* If declared, then sym->class != unknown_sym. */
- assert (0);
- }
-
+ assert (sym->status != declared);
+ complain_at (sym->location,
+ sym->status == needed ? complaint : Wother,
+ _("symbol %s is used, but is not defined as a token"
+ " and has no rules"),
+ sym->tag);
sym->class = nterm_sym;
sym->number = nvars++;
}
for (int i = 0; i < 2; ++i)
- if (sym->props[i].kind == CODE_PROPS_NONE && sym->type_name)
- {
- semantic_type *sem_type = semantic_type_get (sym->type_name, NULL);
- if (sem_type
- && sem_type->props[i].kind != CODE_PROPS_NONE)
- sem_type->props[i].is_used = true;
- }
+ symbol_code_props_get (sym, i)->is_used = true;
/* Set the semantic type status associated to the current symbol to
'declared' so that we could check semantic types unnecessary uses. */
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
static void
user_token_number_redeclaration (int num, symbol *first, symbol *second)
{
+ unsigned i = 0;
/* User token numbers are not assigned during the parsing, but in a
second step, via a traversal of the symbol table sorted on tag.
first = second;
second = tmp;
}
- complain_at (second->location, complaint,
- _("user token number %d redeclaration for %s"),
- num, second->tag);
- complain_at (first->location, complaint, _("previous declaration for %s"),
- first->tag);
+ complain_at_indent (second->location, complaint, &i,
+ _("user token number %d redeclaration for %s"),
+ num, second->tag);
+ i += SUB_INDENT;
+ complain_at_indent (first->location, complaint, &i,
+ _("previous declaration for %s"),
+ first->tag);
}
/*--------------------------------------------------.
_("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;
-}