former CPP macros `RIGHT_ASSOC', `LEFT_ASSOC' and `NON_ASSOC' with
`right_assoc', `left_assoc' and `non_assoc'.
Adjust all dependencies.
* src/reader.c: Formatting changes.
(LTYPESTR): Don't define it, use it as a literal in
`reader_output_yylsp'.
* src/symtab.h (symbol_class): New enum type which replaces the
former CPP macros `SUNKNOWN', `STOKEN and `SNTERM' with
`sunknown', `stoken and `snterm'.
+2000-10-02 Akim Demaille <akim@epita.fr>
+
+ * src/gram.h (associativity): New enum type which replaces the
+ former CPP macros `RIGHT_ASSOC', `LEFT_ASSOC' and `NON_ASSOC' with
+ `right_assoc', `left_assoc' and `non_assoc'.
+ Adjust all dependencies.
+ * src/reader.c: Formatting changes.
+ (LTYPESTR): Don't define it, use it as a literal in
+ `reader_output_yylsp'.
+ * src/symtab.h (symbol_class): New enum type which replaces the
+ former CPP macros `SUNKNOWN', `STOKEN and `SNTERM' with
+ `sunknown', `stoken and `snterm'.
+
2000-10-02 Akim Demaille <akim@epita.fr>
* src/getargs.c (fixed_outfiles): Rename as...
2000-10-02 Akim Demaille <akim@epita.fr>
* src/getargs.c (fixed_outfiles): Rename as...
log_resolution (state, lookaheadnum, i, _("shift"));
break;
log_resolution (state, lookaheadnum, i, _("shift"));
break;
log_resolution (state, lookaheadnum, i, _("reduce"));
break;
log_resolution (state, lookaheadnum, i, _("reduce"));
break;
log_resolution (state, lookaheadnum, i, _("an error"));
break;
}
log_resolution (state, lookaheadnum, i, _("an error"));
break;
}
- if (sassoc[i] != RIGHT_ASSOC)
+ if (sassoc[i] != right_assoc)
{
*fp2 &= ~mask; /* flush the shift for this token */
flush_shift (state, i);
}
{
*fp2 &= ~mask; /* flush the shift for this token */
flush_shift (state, i);
}
- if (sassoc[i] != LEFT_ASSOC)
+ if (sassoc[i] != left_assoc)
{
*fp1 &= ~mask; /* flush the reduce for this token */
}
{
*fp1 &= ~mask; /* flush the reduce for this token */
}
- if (sassoc[i] == NON_ASSOC)
+ if (sassoc[i] == non_assoc)
{
/* Record an explicit error for this token. */
*errtokens++ = i;
{
/* Record an explicit error for this token. */
*errtokens++ = i;
/* associativity values in elements of rassoc, sassoc. */
/* associativity values in elements of rassoc, sassoc. */
+typedef enum
+{
+ right_assoc,
+ left_assoc,
+ non_assoc
+} associativity;
-#define RIGHT_ASSOC 1
-#define LEFT_ASSOC 2
-#define NON_ASSOC 3
/* token translation table: indexed by a token number as returned by
the user's yylex routine, it yields the internal token number used
/* token translation table: indexed by a token number as returned by
the user's yylex routine, it yields the internal token number used
*p++ = '\'';
*p = 0;
symval = getsym (token_buffer);
*p++ = '\'';
*p = 0;
symval = getsym (token_buffer);
- symval->class = STOKEN;
+ symval->class = token_sym;
if (!symval->user_token_number)
symval->user_token_number = code;
return IDENTIFIER;
if (!symval->user_token_number)
symval->user_token_number = code;
return IDENTIFIER;
*p = 0;
symval = getsym (token_buffer);
*p = 0;
symval = getsym (token_buffer);
- symval->class = STOKEN;
+ symval->class = token_sym;
extern char *printable_version PARAMS ((int));
extern char *printable_version PARAMS ((int));
-#define LTYPESTR "\
-\n\
-#ifndef YYLTYPE\n\
-typedef\n\
- struct yyltype\n\
-\
- {\n\
- int timestamp;\n\
- int first_line;\n\
- int first_column;\
-\n\
- int last_line;\n\
- int last_column;\n\
- char *text;\n\
- }\n\
-\
- yyltype;\n\
-\n\
-#define YYLTYPE yyltype\n\
-#endif\n\
-\n"
-
/* Number of slots allocated (but not necessarily used yet) in `rline' */
static int rline_allocated;
/* Number of slots allocated (but not necessarily used yet) in `rline' */
static int rline_allocated;
they must be unions. */
static int value_components_used;
they must be unions. */
static int value_components_used;
-static int typed; /* nonzero if %union has been seen. */
+/* Nonzero if %union has been seen. */
+static int typed;
-static int lastprec; /* incremented for each %left, %right or %nonassoc seen */
+/* Incremented for each %left, %right or %nonassoc seen */
+static int lastprec;
-static int gensym_count; /* incremented for each generated symbol */
+/* Incremented for each generated symbol */
+static int gensym_count;
static bucket *errtoken;
static bucket *undeftoken;
static bucket *errtoken;
static bucket *undeftoken;
-/*-----------------------------------------------------------------.
-| Parse what comes after %token or %nterm. For %token, what_is is |
-| STOKEN and what_is_not is SNTERM. For %nterm, the arguments are |
-| reversed. |
-`-----------------------------------------------------------------*/
+/*-------------------------------------------------------------------.
+| Parse what comes after %token or %nterm. For %token, WHAT_IS is |
+| token_sym and WHAT_IS_NOT is nterm_sym. For %nterm, the arguments |
+| are reversed. |
+`-------------------------------------------------------------------*/
-parse_token_decl (int what_is, int what_is_not)
+parse_token_decl (symbol_class what_is, symbol_class what_is_not)
{
int token = 0;
char *typename = 0;
{
int token = 0;
char *typename = 0;
else if (token == IDENTIFIER && *symval->tag == '\"' && symbol)
{
translations = 1;
else if (token == IDENTIFIER && *symval->tag == '\"' && symbol)
{
translations = 1;
- symval->class = STOKEN;
+ symval->class = token_sym;
symval->type_name = typename;
symval->user_token_number = symbol->user_token_number;
symbol->user_token_number = SALIAS;
symval->type_name = typename;
symval->user_token_number = symbol->user_token_number;
symbol->user_token_number = SALIAS;
if (symbol->class == what_is_not)
complain (_("symbol %s redefined"), symbol->tag);
symbol->class = what_is;
if (symbol->class == what_is_not)
complain (_("symbol %s redefined"), symbol->tag);
symbol->class = what_is;
- if (what_is == SNTERM && oldclass != SNTERM)
+ if (what_is == nterm_sym && oldclass != nterm_sym)
symbol->value = nvars++;
if (typename)
symbol->value = nvars++;
if (typename)
else
{
complain (_("`%s' is invalid in %s"),
else
{
complain (_("`%s' is invalid in %s"),
- token_buffer, (what_is == STOKEN) ? "%token" : "%nterm");
+ token_buffer, (what_is == token_sym) ? "%token" : "%nterm");
-/* Parse what comes after %start */
+/*------------------------------.
+| Parse what comes after %start |
+`------------------------------*/
static void
parse_start_decl (void)
static void
parse_start_decl (void)
-/* read in a %left, %right or %nonassoc declaration and record its information. */
-/* assoc is either LEFT_ASSOC, RIGHT_ASSOC or NON_ASSOC. */
+/*----------------------------------------------------------------.
+| Read in a %left, %right or %nonassoc declaration and record its |
+| information. |
+`----------------------------------------------------------------*/
-parse_assoc_decl (int assoc)
+parse_assoc_decl (associativity assoc)
{
int k;
char *name = NULL;
{
int k;
char *name = NULL;
complain (_("redefining precedence of %s"), symval->tag);
symval->prec = lastprec;
symval->assoc = assoc;
complain (_("redefining precedence of %s"), symval->tag);
symval->prec = lastprec;
symval->assoc = assoc;
- if (symval->class == SNTERM)
+ if (symval->class == nterm_sym)
complain (_("symbol %s redefined"), symval->tag);
complain (_("symbol %s redefined"), symval->tag);
- symval->class = STOKEN;
+ symval->class = token_sym;
if (name)
{ /* record the type, if one is specified */
if (symval->type_name == NULL)
if (name)
{ /* record the type, if one is specified */
if (symval->type_name == NULL)
-/* copy the union declaration into fattrs (and fdefines),
- where it is made into the
- definition of YYSTYPE, the type of elements of the parser value stack. */
+/*-------------------------------------------------------------------.
+| Copy the union declaration into fattrs (and fdefines), where it is |
+| made into the definition of YYSTYPE, the type of elements of the |
+| parser value stack. |
+`-------------------------------------------------------------------*/
static void
parse_union_decl (void)
static void
parse_union_decl (void)
-/* parse the declaration %expect N which says to expect N
- shift-reduce conflicts. */
+
+/*-------------------------------------------------------.
+| Parse the declaration %expect N which says to expect N |
+| shift-reduce conflicts. |
+`-------------------------------------------------------*/
static void
parse_expect_decl (void)
static void
parse_expect_decl (void)
skip_to_char ('%');
return;
}
skip_to_char ('%');
return;
}
- symval->class = STOKEN;
+ symval->class = token_sym;
symval->type_name = typename;
symval->user_token_number = SALIAS;
symbol = symval;
symval->type_name = typename;
symval->user_token_number = SALIAS;
symbol = symval;
skip_to_char ('%');
return;
}
skip_to_char ('%');
return;
}
- symval->class = STOKEN;
+ symval->class = token_sym;
symval->type_name = typename;
symval->user_token_number = usrtoknum;
symval->type_name = typename;
symval->user_token_number = usrtoknum;
nsyms--; /* symbol and symval combined are only one symbol */
}
nsyms--; /* symbol and symval combined are only one symbol */
}
/*----------------------------------------------------------------.
| Read from finput until `%%' is seen. Discard the `%%'. Handle |
| any `%' declarations, and copy the contents of any `%{ ... %}' |
/*----------------------------------------------------------------.
| Read from finput until `%%' is seen. Discard the `%%'. Handle |
| any `%' declarations, and copy the contents of any `%{ ... %}' |
- parse_token_decl (STOKEN, SNTERM);
+ parse_token_decl (token_sym, nterm_sym);
- parse_token_decl (SNTERM, STOKEN);
+ parse_token_decl (nterm_sym, token_sym);
case THONG:
parse_thong_decl ();
break;
case THONG:
parse_thong_decl ();
break;
- parse_assoc_decl (LEFT_ASSOC);
+ parse_assoc_decl (left_assoc);
- parse_assoc_decl (RIGHT_ASSOC);
+ parse_assoc_decl (right_assoc);
- parse_assoc_decl (NON_ASSOC);
+ parse_assoc_decl (non_assoc);
break;
case SEMANTIC_PARSER:
break;
case SEMANTIC_PARSER:
sprintf (token_buffer, "@%d", ++gensym_count);
sym = getsym (token_buffer);
sprintf (token_buffer, "@%d", ++gensym_count);
sym = getsym (token_buffer);
+ sym->class = nterm_sym;
sym->value = nvars++;
return sym;
}
sym->value = nvars++;
return sym;
}
/* mark the rule's lhs as a nonterminal if not already so. */
/* mark the rule's lhs as a nonterminal if not already so. */
- if (lhs->class == SUNKNOWN)
+ if (lhs->class == unknown_sym)
+ lhs->class = nterm_sym;
lhs->value = nvars;
nvars++;
}
lhs->value = nvars;
nvars++;
}
- else if (lhs->class == STOKEN)
+ else if (lhs->class == token_sym)
complain (_("rule given for %s, which is a token"), lhs->tag);
/* read the rhs of the rule. */
complain (_("rule given for %s, which is a token"), lhs->tag);
/* read the rhs of the rule. */
*/
else if (t == TOKEN)
{
*/
else if (t == TOKEN)
{
- parse_token_decl (STOKEN, SNTERM);
+ parse_token_decl (token_sym, nterm_sym);
t = lex ();
}
else if (t == NTERM)
{
t = lex ();
}
else if (t == NTERM)
{
- parse_token_decl (SNTERM, STOKEN);
+ parse_token_decl (nterm_sym, token_sym);
t = lex ();
}
else if (t == TYPE)
t = lex ();
}
else if (t == TYPE)
/* Report any undefined symbols and consider them nonterminals. */
for (bp = firstsymbol; bp; bp = bp->next)
/* Report any undefined symbols and consider them nonterminals. */
for (bp = firstsymbol; bp; bp = bp->next)
- if (bp->class == SUNKNOWN)
+ if (bp->class == unknown_sym)
{
complain (_
("symbol %s is used, but is not defined as a token and has no rules"),
bp->tag);
{
complain (_
("symbol %s is used, but is not defined as a token and has no rules"),
bp->tag);
for (bp = firstsymbol; bp; bp = bp->next)
{
for (bp = firstsymbol; bp; bp = bp->next)
{
- if (bp->class == SNTERM)
+ if (bp->class == nterm_sym)
{
bp->value += ntokens;
}
{
bp->value += ntokens;
}
continue; /* do not do processing below for SALIASs */
}
continue; /* do not do processing below for SALIASs */
}
- else /* bp->class == STOKEN */
+ else /* bp->class == token_sym */
- if (bp->class == STOKEN)
+ if (bp->class == token_sym)
{
if (translations && !(bp->user_token_number))
bp->user_token_number = ++last_user_token_number;
{
if (translations && !(bp->user_token_number))
bp->user_token_number = ++last_user_token_number;
if (!noparserflag)
output_token_defines (ftable);
if (!noparserflag)
output_token_defines (ftable);
- if (startval->class == SUNKNOWN)
+ if (startval->class == unknown_sym)
fatal (_("the start symbol %s is undefined"), startval->tag);
fatal (_("the start symbol %s is undefined"), startval->tag);
- else if (startval->class == STOKEN)
+ else if (startval->class == token_sym)
fatal (_("the start symbol %s is a token"), startval->tag);
start_symbol = startval->value;
fatal (_("the start symbol %s is a token"), startval->tag);
start_symbol = startval->value;
ritem[itemno++] = p->sym->value;
/* A rule gets by default the precedence and associativity
of the last token in it. */
ritem[itemno++] = p->sym->value;
/* A rule gets by default the precedence and associativity
of the last token in it. */
- if (p->sym->class == STOKEN)
+ if (p->sym->class == token_sym)
{
rprec[ruleno] = p->sym->prec;
rassoc[ruleno] = p->sym->assoc;
{
rprec[ruleno] = p->sym->prec;
rassoc[ruleno] = p->sym->assoc;
tabinit ();
/* Construct the error token */
errtoken = getsym ("error");
tabinit ();
/* Construct the error token */
errtoken = getsym ("error");
- errtoken->class = STOKEN;
+ errtoken->class = token_sym;
errtoken->user_token_number = 256; /* Value specified by POSIX. */
/* Construct a token that represents all undefined literal tokens.
It is always token number 2. */
undeftoken = getsym ("$undefined.");
errtoken->user_token_number = 256; /* Value specified by POSIX. */
/* Construct a token that represents all undefined literal tokens.
It is always token number 2. */
undeftoken = getsym ("$undefined.");
- undeftoken->class = STOKEN;
+ undeftoken->class = token_sym;
undeftoken->user_token_number = 2;
/* Read the declaration section. Copy %{ ... %} groups to FTABLE
undeftoken->user_token_number = 2;
/* Read the declaration section. Copy %{ ... %} groups to FTABLE
void
reader_output_yylsp (FILE *f)
{
if (yylsp_needed)
void
reader_output_yylsp (FILE *f)
{
if (yylsp_needed)
+ fputs ("\
+\n\
+#ifndef YYLTYPE\n\
+typedef\n\
+ struct yyltype\n\
+\
+ {\n\
+ int timestamp;\n\
+ int first_line;\n\
+ int first_column;\
+\n\
+ int last_line;\n\
+ int last_column;\n\
+ char *text;\n\
+ }\n\
+\
+ yyltype;\n\
+\n\
+#define YYLTYPE yyltype\n\
+#endif\n\
+\n",
+ f);
bp->link = symtab[hashval];
bp->next = NULL;
bp->tag = copys(key);
bp->link = symtab[hashval];
bp->next = NULL;
bp->tag = copys(key);
+ bp->class = unknown_sym;
if (firstsymbol == NULL)
{
if (firstsymbol == NULL)
{
#ifndef SYMTAB_H_
# define SYMTAB_H_
#ifndef SYMTAB_H_
# define SYMTAB_H_
#define TABSIZE 1009
/* symbol classes */
#define TABSIZE 1009
/* symbol classes */
-#define SUNKNOWN 0
-#define STOKEN 1 /* terminal symbol */
-#define SNTERM 2 /* non-terminal */
+typedef enum
+{
+ unknown_sym,
+ token_sym, /* terminal symbol */
+ nterm_sym /* non-terminal */
+} symbol_class;
#define SALIAS -9991 /* for symbol generated with an alias */
#define SALIAS -9991 /* for symbol generated with an alias */
char *type_name;
short value;
short prec;
char *type_name;
short value;
short prec;
short user_token_number;
/* special value SALIAS in the identifier half of the
identifier-symbol pair for an alias */
struct bucket *alias;
/* points to the other in the identifier-symbol pair for an alias */
short user_token_number;
/* special value SALIAS in the identifier half of the
identifier-symbol pair for an alias */
struct bucket *alias;
/* points to the other in the identifier-symbol pair for an alias */