* 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'.
This commit is contained in:
Akim Demaille
2000-10-02 08:51:00 +00:00
parent 1916f98ef8
commit d7020c2078
7 changed files with 120 additions and 86 deletions

View File

@@ -1,3 +1,16 @@
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...

View File

@@ -131,29 +131,29 @@ resolve_sr_conflict (int state, int lookaheadnum)
switch (sassoc[i])
{
case RIGHT_ASSOC:
case right_assoc:
log_resolution (state, lookaheadnum, i, _("shift"));
break;
case LEFT_ASSOC:
case left_assoc:
log_resolution (state, lookaheadnum, i, _("reduce"));
break;
case NON_ASSOC:
case non_assoc:
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);
}
if (sassoc[i] != LEFT_ASSOC)
if (sassoc[i] != left_assoc)
{
*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;

View File

@@ -97,10 +97,13 @@ extern int start_symbol;
/* 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

View File

@@ -418,7 +418,7 @@ lex (void)
*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;
@@ -440,7 +440,7 @@ lex (void)
*p = 0;
symval = getsym (token_buffer);
symval->class = STOKEN;
symval->class = token_sym;
return IDENTIFIER;
}

View File

@@ -34,28 +34,6 @@
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;
@@ -78,11 +56,14 @@ static bucket *startval;
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;
@@ -358,14 +339,14 @@ copy_definition (void)
}
/*-----------------------------------------------------------------.
| 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. |
`-------------------------------------------------------------------*/
static void
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;
@@ -398,7 +379,7 @@ parse_token_decl (int what_is, int what_is_not)
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;
@@ -417,7 +398,7 @@ parse_token_decl (int what_is, int what_is_not)
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)
@@ -436,7 +417,7 @@ parse_token_decl (int what_is, int what_is_not)
else
{
complain (_("`%s' is invalid in %s"),
token_buffer, (what_is == STOKEN) ? "%token" : "%nterm");
token_buffer, (what_is == token_sym) ? "%token" : "%nterm");
skip_to_char ('%');
}
}
@@ -444,7 +425,9 @@ parse_token_decl (int what_is, int what_is_not)
}
/* Parse what comes after %start */
/*------------------------------.
| Parse what comes after %start |
`------------------------------*/
static void
parse_start_decl (void)
@@ -556,11 +539,13 @@ parse_type_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. |
`----------------------------------------------------------------*/
static void
parse_assoc_decl (int assoc)
parse_assoc_decl (associativity assoc)
{
int k;
char *name = NULL;
@@ -597,9 +582,9 @@ parse_assoc_decl (int 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);
symval->class = STOKEN;
symval->class = token_sym;
if (name)
{ /* record the type, if one is specified */
if (symval->type_name == NULL)
@@ -639,9 +624,11 @@ token_buffer);
/* 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)
@@ -710,8 +697,11 @@ 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)
@@ -789,7 +779,7 @@ parse_thong_decl (void)
skip_to_char ('%');
return;
}
symval->class = STOKEN;
symval->class = token_sym;
symval->type_name = typename;
symval->user_token_number = SALIAS;
symbol = symval;
@@ -812,7 +802,7 @@ parse_thong_decl (void)
skip_to_char ('%');
return;
}
symval->class = STOKEN;
symval->class = token_sym;
symval->type_name = typename;
symval->user_token_number = usrtoknum;
@@ -822,6 +812,7 @@ parse_thong_decl (void)
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 `%{ ... %}' |
@@ -852,11 +843,11 @@ read_declarations (void)
break;
case TOKEN:
parse_token_decl (STOKEN, SNTERM);
parse_token_decl (token_sym, nterm_sym);
break;
case NTERM:
parse_token_decl (SNTERM, STOKEN);
parse_token_decl (nterm_sym, token_sym);
break;
case TYPE:
@@ -877,16 +868,17 @@ read_declarations (void)
case THONG:
parse_thong_decl ();
break;
case LEFT:
parse_assoc_decl (LEFT_ASSOC);
parse_assoc_decl (left_assoc);
break;
case RIGHT:
parse_assoc_decl (RIGHT_ASSOC);
parse_assoc_decl (right_assoc);
break;
case NONASSOC:
parse_assoc_decl (NON_ASSOC);
parse_assoc_decl (non_assoc);
break;
case SEMANTIC_PARSER:
@@ -1234,7 +1226,7 @@ gensym (void)
sprintf (token_buffer, "@%d", ++gensym_count);
sym = getsym (token_buffer);
sym->class = SNTERM;
sym->class = nterm_sym;
sym->value = nvars++;
return sym;
}
@@ -1374,13 +1366,13 @@ readgram (void)
/* mark the rule's lhs as a nonterminal if not already so. */
if (lhs->class == SUNKNOWN)
if (lhs->class == unknown_sym)
{
lhs->class = SNTERM;
lhs->class = nterm_sym;
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. */
@@ -1534,12 +1526,12 @@ readgram (void)
*/
else if (t == TOKEN)
{
parse_token_decl (STOKEN, SNTERM);
parse_token_decl (token_sym, nterm_sym);
t = lex ();
}
else if (t == NTERM)
{
parse_token_decl (SNTERM, STOKEN);
parse_token_decl (nterm_sym, token_sym);
t = lex ();
}
else if (t == TYPE)
@@ -1592,12 +1584,12 @@ readgram (void)
/* 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);
bp->class = SNTERM;
bp->class = nterm_sym;
bp->value = nvars++;
}
@@ -1684,7 +1676,7 @@ packsymbols (void)
for (bp = firstsymbol; bp; bp = bp->next)
{
if (bp->class == SNTERM)
if (bp->class == nterm_sym)
{
bp->value += ntokens;
}
@@ -1724,12 +1716,12 @@ packsymbols (void)
continue; /* do not do processing below for SALIASs */
}
else /* bp->class == STOKEN */
else /* bp->class == token_sym */
{
bp->value = tokno++;
}
if (bp->class == STOKEN)
if (bp->class == token_sym)
{
if (translations && !(bp->user_token_number))
bp->user_token_number = ++last_user_token_number;
@@ -1775,9 +1767,9 @@ packsymbols (void)
if (!noparserflag)
output_token_defines (ftable);
if (startval->class == SUNKNOWN)
if (startval->class == unknown_sym)
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;
@@ -1849,7 +1841,7 @@ packgram (void)
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;
@@ -1925,12 +1917,12 @@ reader (void)
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.");
undeftoken->class = STOKEN;
undeftoken->class = token_sym;
undeftoken->user_token_number = 2;
/* Read the declaration section. Copy %{ ... %} groups to FTABLE
@@ -1967,9 +1959,31 @@ reader (void)
free_symtab ();
}
void
reader_output_yylsp (FILE *f)
{
if (yylsp_needed)
fprintf (f, LTYPESTR);
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);
}

View File

@@ -101,7 +101,7 @@ getsym (const char *key)
bp->link = symtab[hashval];
bp->next = NULL;
bp->tag = copys(key);
bp->class = SUNKNOWN;
bp->class = unknown_sym;
if (firstsymbol == NULL)
{

View File

@@ -20,14 +20,18 @@
#ifndef SYMTAB_H_
# define SYMTAB_H_
# include "gram.h"
#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 */
@@ -39,13 +43,13 @@ typedef struct bucket
char *type_name;
short value;
short prec;
short assoc;
associativity assoc;
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 */
char class;
symbol_class class;
}
bucket;