* src/symtab.c, src/symtab.c (symbol_type_set)

(symbol_precedence_set): New.
* src/reader.c (parse_type_decl, parse_assoc_decl): Use them.
(value_components_used): Remove, unused.
This commit is contained in:
Akim Demaille
2002-06-10 08:36:49 +00:00
parent 2f1afb737f
commit 3ae2b51f08
5 changed files with 50 additions and 23 deletions

View File

@@ -1,3 +1,10 @@
2002-06-10 Akim Demaille <akim@epita.fr>
* src/symtab.c, src/symtab.c (symbol_type_set)
(symbol_precedence_set): New.
* src/reader.c (parse_type_decl, parse_assoc_decl): Use them.
(value_components_used): Remove, unused.
2002-06-09 Akim Demaille <akim@epita.fr> 2002-06-09 Akim Demaille <akim@epita.fr>
Move symbols handling code out of the reader. Move symbols handling code out of the reader.

5
TODO
View File

@@ -3,6 +3,11 @@
* URGENT: Documenting C++ output * URGENT: Documenting C++ output
Write a first documentation for C++ output. Write a first documentation for C++ output.
* value_components_used
Was defined but not used: where was it coming from? It can't be to
check if %union is used, since the user is free to $<foo>n on her
union, doesn't she?
* yyerror, yyprint interface * yyerror, yyprint interface
It should be improved, in particular when using Bison features such as It should be improved, in particular when using Bison features such as
locations, and YYPARSE_PARAMS. For the time being, it is recommended locations, and YYPARSE_PARAMS. For the time being, it is recommended

View File

@@ -52,10 +52,6 @@ int lineno;
static symbol_list *grammar = NULL; static symbol_list *grammar = NULL;
static int start_flag = 0; static int start_flag = 0;
/* Nonzero if components of semantic values are used, implying
they must be unions. */
static int value_components_used;
/* Nonzero if %union has been seen. */ /* Nonzero if %union has been seen. */
static int typed = 0; static int typed = 0;
@@ -378,7 +374,6 @@ copy_dollar (FILE *fin, struct obstack *oout,
{ {
read_type_name (fin); read_type_name (fin);
type_name = token_buffer; type_name = token_buffer;
value_components_used = 1;
c = getc (fin); c = getc (fin);
} }
@@ -525,7 +520,6 @@ parse_token_decl (symbol_class what_is, symbol_class what_is_not)
if (token == tok_typename) if (token == tok_typename)
{ {
typename = xstrdup (token_buffer); typename = xstrdup (token_buffer);
value_components_used = 1;
symbol = NULL; symbol = NULL;
} }
else if (token == tok_identifier && *symval->tag == '\"' && symbol) else if (token == tok_identifier && *symval->tag == '\"' && symbol)
@@ -630,17 +624,12 @@ parse_type_decl (void)
switch (t) switch (t)
{ {
case tok_comma: case tok_comma:
case tok_semicolon: case tok_semicolon:
break; break;
case tok_identifier: case tok_identifier:
if (symval->type_name == NULL) symbol_type_set (symval, name);
symval->type_name = name;
else if (strcmp (name, symval->type_name) != 0)
complain (_("type redeclaration for %s"), symval->tag);
break; break;
default: default:
@@ -689,10 +678,6 @@ parse_assoc_decl (associativity assoc)
break; break;
case tok_identifier: case tok_identifier:
if (symval->prec != 0)
complain (_("redefining precedence of %s"), symval->tag);
symval->prec = lastprec;
symval->assoc = assoc;
if (symval->class == nterm_sym) if (symval->class == nterm_sym)
complain (_("symbol %s redefined"), symval->tag); complain (_("symbol %s redefined"), symval->tag);
if (symval->number == NUMBER_UNDEFINED) if (symval->number == NUMBER_UNDEFINED)
@@ -700,13 +685,9 @@ parse_assoc_decl (associativity assoc)
symval->number = ntokens++; symval->number = ntokens++;
symval->class = token_sym; symval->class = token_sym;
} }
symbol_precedence_set (symval, lastprec, assoc);
if (name) if (name)
{ /* record the type, if one is specified */ symbol_type_set (symval, name);
if (symval->type_name == NULL)
symval->type_name = name;
else if (strcmp (name, symval->type_name) != 0)
complain (_("type redeclaration for %s"), symval->tag);
}
break; break;
case tok_number: case tok_number:
@@ -851,7 +832,6 @@ parse_thong_decl (void)
if (token == tok_typename) if (token == tok_typename)
{ {
typename = xstrdup (token_buffer); typename = xstrdup (token_buffer);
value_components_used = 1;
token = lex (); /* fetch first token */ token = lex (); /* fetch first token */
} }

View File

@@ -59,6 +59,34 @@ symbol_new (const char *tag)
} }
/*-----------------------------------------.
| Set the TYPE_NAME associated to SYMBOL. |
`-----------------------------------------*/
void
symbol_type_set (symbol_t *symbol, char *type_name)
{
if (symbol->type_name)
complain (_("type redeclaration for %s"), symbol->tag);
symbol->type_name = type_name;
}
/*------------------------------------------.
| Set the PRECEDENCE associated to SYMBOL. |
`------------------------------------------*/
void
symbol_precedence_set (symbol_t *symbol,
int prec, associativity assoc)
{
if (symbol->prec != 0)
complain (_("redefining precedence of %s"), symbol->tag);
symbol->prec = prec;
symbol->assoc = assoc;
}
/*------------. /*------------.
| Free THIS. | | Free THIS. |
`------------*/ `------------*/

View File

@@ -89,6 +89,13 @@ symbol_t *getsym PARAMS ((const char *key));
void symbol_make_alias PARAMS ((symbol_t *symbol, symbol_t *symval, void symbol_make_alias PARAMS ((symbol_t *symbol, symbol_t *symval,
char *typename)); char *typename));
/* Set the TYPE_NAME associated to SYMBOL. */
void symbol_type_set PARAMS ((symbol_t *symbol, char *type_name));
/* Set the PRECEDENCE associated to SYMBOL. */
void symbol_precedence_set PARAMS ((symbol_t *symbol,
int prec, associativity assoc));
/* Distinguished symbols. AXIOM is the real start symbol, that used /* Distinguished symbols. AXIOM is the real start symbol, that used
by the automaton. STARTSYMBOL is the one specified by the user. by the automaton. STARTSYMBOL is the one specified by the user.
*/ */