X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/680e8701b5ad9718f18f1493e30134b52bceaaca..e91ff6ce3d2653b41265591dafd4bdb32ae114c2:/src/reader.c?ds=sidebyside diff --git a/src/reader.c b/src/reader.c index 6f45ffa2..6a99cfff 100644 --- a/src/reader.c +++ b/src/reader.c @@ -199,13 +199,13 @@ symbol_pack (symbol_t *this) /* This symbol and its alias are a single token defn. Allocate a tokno, and assign to both check agreement of prec and assoc fields and make both the same */ - if (this->number == -1) + if (this->number == NUMBER_UNDEFINED) { if (this == eoftoken || this->alias == eoftoken) this->number = this->alias->number = 0; else { - assert (this->alias->number != -1); + assert (this->alias->number != NUMBER_UNDEFINED); this->number = this->alias->number; } } @@ -215,7 +215,7 @@ symbol_pack (symbol_t *this) } else /* this->class == token_sym */ { - assert (this->number != -1); + assert (this->number != NUMBER_UNDEFINED); } symbols[this->number] = this; @@ -237,7 +237,7 @@ symbol_translation (symbol_t *this) && this->user_token_number != SALIAS) { /* A token which translation has already been set? */ - if (token_translations[this->user_token_number] != 2) + if (token_translations[this->user_token_number] != undeftoken->number) complain (_("tokens %s and %s both assigned number %d"), symbols[token_translations[this->user_token_number]]->tag, this->tag, this->user_token_number); @@ -705,7 +705,7 @@ parse_token_decl (symbol_class what_is, symbol_class what_is_not) symbol->class = what_is; if (what_is == nterm_sym && oldclass != nterm_sym) symbol->number = nvars++; - if (what_is == token_sym && symbol->number == -1) + if (what_is == token_sym && symbol->number == NUMBER_UNDEFINED) symbol->number = ntokens++; if (typename) @@ -857,7 +857,7 @@ parse_assoc_decl (associativity assoc) symval->assoc = assoc; if (symval->class == nterm_sym) complain (_("symbol %s redefined"), symval->tag); - if (symval->number == -1) + if (symval->number == NUMBER_UNDEFINED) { symval->number = ntokens++; symval->class = token_sym; @@ -1637,9 +1637,9 @@ readgram (void) grammar = p; startval = axiom; - if (nsyms > MAXSHORT) + if (nsyms > SHRT_MAX) fatal (_("too many symbols (tokens plus nonterminals); maximum %d"), - MAXSHORT); + SHRT_MAX); assert (nsyms == ntokens + nvars); } @@ -1678,15 +1678,37 @@ read_additionnal_code (void) static void token_translations_init (void) { - int last_user_token_number = 256; + int num_256_available_p = TRUE; int i; - /* Set the user numbers. */ + /* Find the highest user token number, and whether 256, the POSIX + preferred user token number for the error token, is used. */ + max_user_token_number = 0; + for (i = 0; i < ntokens; ++i) + { + symbol_t *this = symbols[i]; + if (this->user_token_number != SUNDEF) + { + if (this->user_token_number > max_user_token_number) + max_user_token_number = this->user_token_number; + if (this->user_token_number == 256) + num_256_available_p = FALSE; + } + } + + /* If 256 is not used, assign it to error, to follow POSIX. */ + if (num_256_available_p && errtoken->user_token_number == SUNDEF) + errtoken->user_token_number = 256; + + /* Set the missing user numbers. */ + if (max_user_token_number < 256) + max_user_token_number = 256; + for (i = 0; i < ntokens; ++i) { symbol_t *this = symbols[i]; if (this->user_token_number == SUNDEF) - this->user_token_number = ++last_user_token_number; + 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; } @@ -1697,8 +1719,7 @@ token_translations_init (void) token number for $undefined., which represents all invalid inputs. */ for (i = 0; i < max_user_token_number + 1; i++) - token_translations[i] = 2; - + token_translations[i] = undeftoken->number; symbols_do (symbol_translation, NULL); } @@ -1718,8 +1739,6 @@ packsymbols (void) token_translations_init (); - error_token_number = errtoken->number; - if (startval->class == unknown_sym) fatal (_("the start symbol %s is undefined"), startval->tag); else if (startval->class == token_sym) @@ -1741,11 +1760,7 @@ packgram (void) int ruleno; symbol_list *p; - /* We use short to index items. */ - if (nritems >= MAXSHORT) - fatal (_("too many items (max %d)"), MAXSHORT); - - ritem = XCALLOC (short, nritems + 1); + ritem = XCALLOC (item_number_t, nritems + 1); rules = XCALLOC (rule_t, nrules) - 1; itemno = 0; @@ -1769,7 +1784,9 @@ packgram (void) p = p->next; while (p && p->sym) { - ritem[itemno++] = p->sym->number; + /* item_number_t = token_number_t. + But the former needs to contain more: negative rule numbers. */ + ritem[itemno++] = token_number_as_item_number (p->sym->number); /* A rule gets by default the precedence and associativity of the last token in it. */ if (p->sym->class == token_sym) @@ -1828,14 +1845,12 @@ reader (void) errtoken = getsym ("error"); errtoken->class = token_sym; errtoken->number = ntokens++; - 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 = token_sym; undeftoken->number = ntokens++; - undeftoken->user_token_number = 2; /* Initialize the obstacks. */ obstack_init (&action_obstack);