symval->class = token_sym;
symval->type_name = typename;
symval->user_token_number = symbol->user_token_number;
- symbol->user_token_number = SALIAS;
+ symbol->user_token_number = USER_NUMBER_ALIAS;
symval->alias = symbol;
symbol->alias = symval;
/* symbol and symval combined are only one symbol */
symbol_check_alias_consistence (symbol_t *this)
{
/* Check only those who _are_ the aliases. */
- if (this->alias && this->user_token_number == SALIAS)
+ if (this->alias && this->user_token_number == USER_NUMBER_ALIAS)
{
if (this->prec != this->alias->prec)
{
this->number = this->alias->number;
}
}
- /* Do not do processing below for SALIASs. */
- if (this->user_token_number == SALIAS)
+ /* Do not do processing below for USER_NUMBER_ALIASs. */
+ if (this->user_token_number == USER_NUMBER_ALIAS)
return TRUE;
}
else /* this->class == token_sym */
{
/* Non-terminal? */
if (this->class == token_sym
- && this->user_token_number != SALIAS)
+ && this->user_token_number != USER_NUMBER_ALIAS)
{
/* A token which translation has already been set? */
if (token_translations[this->user_token_number] != undeftoken->number)
| |
| Two symbols are entered in the table, one for the token symbol and |
| one for the literal. Both are given the <type>, if any, from the |
-| declaration. The ->user_token_number of the first is SALIAS and |
-| the ->user_token_number of the second is set to the number, if |
-| any, from the declaration. The two symbols are linked via |
-| pointers in their ->alias fields. |
+| declaration. The ->user_token_number of the first is |
+| USER_NUMBER_ALIAS and the ->user_token_number of the second is set |
+| to the number, if any, from the declaration. The two symbols are |
+| linked via pointers in their ->alias fields. |
| |
| During OUTPUT_DEFINES_TABLE, the symbol is reported thereafter, |
| only the literal string is retained it is the literal string that |
token_t token;
symbol_t *symbol;
char *typename = 0;
- int usrtoknum = SUNDEF;
+ int usrtoknum = USER_NUMBER_UNDEFINED;
token = lex (); /* fetch typename or first token */
if (token == tok_typename)
}
symval->class = token_sym;
symval->type_name = typename;
- symval->user_token_number = SALIAS;
+ symval->user_token_number = USER_NUMBER_ALIAS;
symbol = symval;
token = lex (); /* get number or literal string */
\f
/*------------------------------------------------------------------.
| Assuming that a `{' has just been seen, copy everything up to the |
-| matching `}' into the actions file. RULE_LENGTH is the number of |
-| values in the current rule so far, which says where to find `$0' |
-| with respect to the top of the stack. |
+| matching `}' into ACTION_OBSTACK. |
+| |
+| RULE_LENGTH is the number of values in the current rule so far, |
+| which says where to find `$0' with respect to the top of the |
+| stack. It is not the same as the rule->length in the case of mid |
+| rule actions. |
| |
| This routine is used for actions. |
`------------------------------------------------------------------*/
static void
-parse_braces (symbol_list *rule, int rule_length)
+parse_action (symbol_list *rule, int rule_length)
{
- int c;
- int count;
-
- count = 1;
+ int count = 1;
+ rule->action_line = lineno;
while (count > 0)
{
+ int c;
while ((c = getc (finput)) != '}')
switch (c)
{
case '\n':
- obstack_1grow (&action_obstack, c);
+ copy_character (&action_obstack, c);
++lineno;
break;
case '{':
- obstack_1grow (&action_obstack, c);
+ copy_character (&action_obstack, c);
++count;
break;
fatal (_("unmatched %s"), "`{'");
default:
- obstack_1grow (&action_obstack, c);
+ copy_character (&action_obstack, c);
}
/* Above loop exits when C is '}'. */
if (--count)
- obstack_1grow (&action_obstack, c);
+ copy_character (&action_obstack, c);
}
obstack_1grow (&action_obstack, '\0');
-}
-
-
-static void
-parse_action (symbol_list *rule, int rule_length)
-{
- rule->action_line = lineno;
- parse_braces (rule, rule_length);
rule->action = obstack_finish (&action_obstack);
}
for (i = 0; i < ntokens; ++i)
{
symbol_t *this = symbols[i];
- if (this->user_token_number != SUNDEF)
+ if (this->user_token_number != USER_NUMBER_UNDEFINED)
{
if (this->user_token_number > max_user_token_number)
max_user_token_number = this->user_token_number;
}
/* If 256 is not used, assign it to error, to follow POSIX. */
- if (num_256_available_p && errtoken->user_token_number == SUNDEF)
+ if (num_256_available_p
+ && errtoken->user_token_number == USER_NUMBER_UNDEFINED)
errtoken->user_token_number = 256;
/* Set the missing user numbers. */
for (i = 0; i < ntokens; ++i)
{
symbol_t *this = symbols[i];
- if (this->user_token_number == SUNDEF)
+ if (this->user_token_number == USER_NUMBER_UNDEFINED)
this->user_token_number = ++max_user_token_number;
if (this->user_token_number > max_user_token_number)
max_user_token_number = this->user_token_number;
static void
packgram (void)
{
- int itemno;
+ unsigned int itemno;
int ruleno;
symbol_list *p;
- ritem = XCALLOC (item_number_t, nritems + 1);
+ ritem = XCALLOC (item_number_t, nritems);
rules = XCALLOC (rule_t, nrules) - 1;
itemno = 0;
p = p->next;
}
- ritem[itemno] = 0;
assert (itemno == nritems);
if (trace_flag)
/* The grammar as a symbol_list is no longer needed. */
LIST_FREE (symbol_list, grammar);
}
-
-void
-grammar_free (void)
-{
- XFREE (ritem);
- free (rules + 1);
- /* Free the symbol table data structure. */
- symbols_free ();
-}