-static void
-packsymbols (void)
-{
- bucket *bp;
- int tokno = 1;
- int i;
- int last_user_token_number;
- static char DOLLAR[] = "$";
-
- tags = XCALLOC (char *, nsyms + 1);
- tags[0] = DOLLAR;
- user_toknums = XCALLOC (short, nsyms + 1);
- user_toknums[0] = 0;
-
- sprec = XCALLOC (short, nsyms);
- sassoc = XCALLOC (short, nsyms);
-
- max_user_token_number = 256;
- last_user_token_number = 256;
-
- for (bp = firstsymbol; bp; bp = bp->next)
- {
- if (bp->class == nterm_sym)
- {
- bp->value += ntokens;
- }
- else if (bp->alias)
- {
- /* 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 (bp->value == 0)
- bp->value = bp->alias->value = tokno++;
-
- if (bp->prec != bp->alias->prec)
- {
- if (bp->prec != 0 && bp->alias->prec != 0
- && bp->user_token_number == SALIAS)
- complain (_("conflicting precedences for %s and %s"),
- bp->tag, bp->alias->tag);
- if (bp->prec != 0)
- bp->alias->prec = bp->prec;
- else
- bp->prec = bp->alias->prec;
- }
-
- if (bp->assoc != bp->alias->assoc)
- {
- if (bp->assoc != 0 && bp->alias->assoc != 0
- && bp->user_token_number == SALIAS)
- complain (_("conflicting assoc values for %s and %s"),
- bp->tag, bp->alias->tag);
- if (bp->assoc != 0)
- bp->alias->assoc = bp->assoc;
- else
- bp->assoc = bp->alias->assoc;
- }
-
- if (bp->user_token_number == SALIAS)
- continue; /* do not do processing below for SALIASs */
-
- }
- else /* bp->class == token_sym */
- {
- bp->value = tokno++;
- }
-
- if (bp->class == token_sym)
- {
- if (translations && !(bp->user_token_number))
- bp->user_token_number = ++last_user_token_number;
- if (bp->user_token_number > max_user_token_number)
- max_user_token_number = bp->user_token_number;
- }
-
- tags[bp->value] = bp->tag;
- user_toknums[bp->value] = bp->user_token_number;
- sprec[bp->value] = bp->prec;
- sassoc[bp->value] = bp->assoc;
-
- }
-
- if (translations)
- {
- int j;
-
- token_translations = XCALLOC (short, max_user_token_number + 1);
-
- /* initialize all entries for literal tokens to 2, the internal
- token number for $undefined., which represents all invalid
- inputs. */
- for (j = 0; j <= max_user_token_number; j++)
- token_translations[j] = 2;
-
- for (bp = firstsymbol; bp; bp = bp->next)
- {
- if (bp->value >= ntokens)
- continue; /* non-terminal */
- if (bp->user_token_number == SALIAS)
- continue;
- if (token_translations[bp->user_token_number] != 2)
- complain (_("tokens %s and %s both assigned number %d"),
- tags[token_translations[bp->user_token_number]],
- bp->tag, bp->user_token_number);
- token_translations[bp->user_token_number] = bp->value;
- }
- }
-
- error_token_number = errtoken->value;
-
- output_token_defines (&output_obstack);
- obstack_1grow (&output_obstack, 0);
- muscle_insert ("tokendef", obstack_finish (&output_obstack));
-
-#if 0
- if (!no_parser_flag)
- output_token_defines (&table_obstack);
-#endif
-
- if (startval->class == unknown_sym)
- fatal (_("the start symbol %s is undefined"), startval->tag);
- else if (startval->class == token_sym)
- fatal (_("the start symbol %s is a token"), startval->tag);
-
- start_symbol = startval->value;
-
- if (defines_flag)
- {
- output_token_defines (&defines_obstack);
-
- if (!pure_parser)
- {
- if (spec_name_prefix)
- obstack_fgrow1 (&defines_obstack, "\nextern YYSTYPE %slval;\n",
- spec_name_prefix);
- else
- obstack_sgrow (&defines_obstack,
- "\nextern YYSTYPE yylval;\n");
- }
-
- if (semantic_parser)
- for (i = ntokens; i < nsyms; i++)
- {
- /* don't make these for dummy nonterminals made by gensym. */
- if (*tags[i] != '@')
- obstack_fgrow2 (&defines_obstack,
- "# define\tNT%s\t%d\n", tags[i], i);
- }
-#if 0
- /* `fdefines' is now a temporary file, so we need to copy its
- contents in `done', so we can't close it here. */
- fclose (fdefines);
- fdefines = NULL;
-#endif
- }
-}
-
-
-/*---------------------------------------------------------------.
-| Convert the rules into the representation using RRHS, RLHS and |
-| RITEMS. |
-`---------------------------------------------------------------*/
-
-static void
-packgram (void)
-{
- int itemno;
- int ruleno;
- symbol_list *p;
-
- bucket *ruleprec;
-
- ritem = XCALLOC (short, nitems + 1);
- rlhs = XCALLOC (short, nrules) - 1;
- rrhs = XCALLOC (short, nrules) - 1;
- rprec = XCALLOC (short, nrules) - 1;
- rprecsym = XCALLOC (short, nrules) - 1;
- rassoc = XCALLOC (short, nrules) - 1;
-
- itemno = 0;
- ruleno = 1;
-
- p = grammar;
- while (p)
- {
- rlhs[ruleno] = p->sym->value;
- rrhs[ruleno] = itemno;
- ruleprec = p->ruleprec;
-
- p = p->next;
- while (p && p->sym)
- {
- ritem[itemno++] = p->sym->value;
- /* A rule gets by default the precedence and associativity
- of the last token in it. */
- if (p->sym->class == token_sym)
- {
- rprec[ruleno] = p->sym->prec;
- rassoc[ruleno] = p->sym->assoc;
- }
- if (p)
- p = p->next;
- }
-
- /* If this rule has a %prec,
- the specified symbol's precedence replaces the default. */
- if (ruleprec)
- {
- rprec[ruleno] = ruleprec->prec;
- rassoc[ruleno] = ruleprec->assoc;
- rprecsym[ruleno] = ruleprec->value;
- }
-
- ritem[itemno++] = -ruleno;
- ruleno++;
-
- if (p)
- p = p->next;
- }
-
- ritem[itemno] = 0;
-}
-\f
-/*-------------------------------------------------------------------.
-| Read in the grammar specification and record it in the format |
-| described in gram.h. All guards are copied into the GUARD_OBSTACK |
-| and all actions into ACTION_OBSTACK, in each case forming the body |
-| of a C function (YYGUARD or YYACTION) which contains a switch |
-| statement to decide which guard or action to execute. |
-`-------------------------------------------------------------------*/
-
-void
-reader (void)
-{
- start_flag = 0;
- startval = NULL; /* start symbol not specified yet. */
-
-#if 0
- /* initially assume token number translation not needed. */
- translations = 0;
-#endif
- /* Nowadays translations is always set to 1, since we give `error' a
- user-token-number to satisfy the Posix demand for YYERRCODE==256.
- */
- translations = 1;
-
- nsyms = 1;
- nvars = 0;
- nrules = 0;
- nitems = 0;
- rline_allocated = 10;
- rline = XCALLOC (short, rline_allocated);
-
- typed = 0;
- lastprec = 0;
-
- semantic_parser = 0;
- pure_parser = 0;
-
- grammar = NULL;
-
- init_lex ();
- lineno = 1;
-
- /* Initialize the muscle obstack. */
- obstack_init (&muscle_obstack);
-
- /* Initialize the symbol table. */
- tabinit ();
-
- /* Construct the error token */
- errtoken = getsym ("error");
- 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 = token_sym;
- undeftoken->user_token_number = 2;
-
- /* Read the declaration section. Copy %{ ... %} groups to
- TABLE_OBSTACK and FDEFINES file. Also notice any %token, %left,
- etc. found there. */
- read_declarations ();
- /* Read in the grammar, build grammar in list form. Write out
- guards and actions. */
- readgram ();
- /* Some C code is given at the end of the grammar file. */
- read_additionnal_code ();
-
- /* Now we know whether we need the line-number stack. If we do,
- write its type into the .tab.h file.
- This is no longer need with header skeleton. */