]>
git.saurik.com Git - bison.git/blob - src/gram.c
57e900a19862ae46bda013e29c9f1840bc8c4280
   1 /* Allocate input grammar variables for bison, 
   2    Copyright (C) 1984, 1986, 1989, 2001, 2002 Free Software Foundation, Inc. 
   4    This file is part of Bison, the GNU Compiler Compiler. 
   6    Bison is free software; you can redistribute it and/or modify 
   7    it under the terms of the GNU General Public License as published by 
   8    the Free Software Foundation; either version 2, or (at your option) 
  11    Bison is distributed in the hope that it will be useful, 
  12    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  14    GNU General Public License for more details. 
  16    You should have received a copy of the GNU General Public License 
  17    along with Bison; see the file COPYING.  If not, write to 
  18    the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
  19    Boston, MA 02111-1307, USA.  */ 
  29 /* Comments for these variables are in gram.h.  */ 
  31 item_number_t 
*ritem 
= NULL
; 
  32 unsigned int nritems 
= 0; 
  35 rule_number_t nrules 
= 0; 
  37 symbol_t 
**symbols 
= NULL
; 
  42 symbol_number_t 
*token_translations 
= NULL
; 
  44 int max_user_token_number 
= 256; 
  50 /*--------------------------------------------------------------. 
  51 | Return true IFF the rule has a `number' smaller than NRULES.  | 
  52 `--------------------------------------------------------------*/ 
  55 rule_useful_p (rule_t 
*r
) 
  57   return r
->number 
< nrules
; 
  61 /*-------------------------------------------------------------. 
  62 | Return true IFF the rule has a `number' higher than NRULES.  | 
  63 `-------------------------------------------------------------*/ 
  66 rule_useless_p (rule_t 
*r
) 
  68   return r
->number 
>= nrules
; 
  72 /*--------------------------------------------------------------------. 
  73 | Return true IFF the rule is not flagged as useful *and* is useful.  | 
  74 | In other words, it was discarded because of conflicts.              | 
  75 `--------------------------------------------------------------------*/ 
  78 rule_never_reduced_p (rule_t 
*r
) 
  80   return !r
->useful 
&& r
->number 
< nrules
; 
  84 /*----------------------------------------------------------------. 
  85 | Print this RULE's number and lhs on OUT.  If a PREVIOUS_LHS was | 
  86 | already displayed (by a previous call for another rule), avoid  | 
  87 | useless repetitions.                                            | 
  88 `----------------------------------------------------------------*/ 
  91 rule_lhs_print (rule_t 
*rule
, symbol_t 
*previous_lhs
, FILE *out
) 
  93   fprintf (out
, "  %3d ", rule
->number
); 
  94   if (previous_lhs 
!= rule
->lhs
) 
  96       fprintf (out
, "%s:", rule
->lhs
->tag
); 
 101       for (n 
= strlen (previous_lhs
->tag
); n 
> 0; --n
) 
 108 /*--------------------------------------. 
 109 | Return the number of symbols in RHS.  | 
 110 `--------------------------------------*/ 
 113 rule_rhs_length (rule_t 
*rule
) 
 117   for (rhsp 
= rule
->rhs
; *rhsp 
>= 0; ++rhsp
) 
 123 /*-------------------------------. 
 124 | Print this RULE's RHS on OUT.  | 
 125 `-------------------------------*/ 
 128 rule_rhs_print (rule_t 
*rule
, FILE *out
) 
 133       for (r 
= rule
->rhs
; *r 
>= 0; r
++) 
 134         fprintf (out
, " %s", symbols
[*r
]->tag
); 
 139       fprintf (out
, " /* %s */\n", _("empty")); 
 144 /*-------------------------. 
 145 | Print this RULE on OUT.  | 
 146 `-------------------------*/ 
 149 rule_print (rule_t 
*rule
, FILE *out
) 
 151   fprintf (out
, "%s:", rule
->lhs
->tag
); 
 152   rule_rhs_print (rule
, out
); 
 156 /*------------------------. 
 157 | Dump RITEM for traces.  | 
 158 `------------------------*/ 
 161 ritem_print (FILE *out
) 
 164   fputs ("RITEM\n", out
); 
 165   for (i 
= 0; i 
< nritems
; ++i
) 
 167       fprintf (out
, "  %s", symbols
[ritem
[i
]]->tag
); 
 169       fprintf (out
, "  (rule %d)\n", item_number_as_rule_number (ritem
[i
])); 
 174 /*------------------------------------------. 
 175 | Return the size of the longest rule RHS.  | 
 176 `------------------------------------------*/ 
 179 ritem_longest_rhs (void) 
 184   for (r 
= 0; r 
< nrules
; ++r
) 
 186       int length 
= rule_rhs_length (&rules
[r
]); 
 195 /*-----------------------------------------------------------------. 
 196 | Print the grammar's rules that match FILTER on OUT under TITLE.  | 
 197 `-----------------------------------------------------------------*/ 
 200 grammar_rules_partial_print (FILE *out
, const char *title
, 
 201                              rule_filter_t filter
) 
 205   symbol_t 
*previous_lhs 
= NULL
; 
 207   /* rule # : LHS -> RHS */ 
 208   for (r 
= 0; r 
< nrules 
+ nuseless_productions
; r
++) 
 210       if (filter 
&& !filter (&rules
[r
])) 
 213         fprintf (out
, "%s\n\n", title
); 
 214       else if (previous_lhs 
&& previous_lhs 
!= rules
[r
].lhs
) 
 217       rule_lhs_print (&rules
[r
], previous_lhs
, out
); 
 218       rule_rhs_print (&rules
[r
], out
); 
 219       previous_lhs 
= rules
[r
].lhs
; 
 226 /*------------------------------------------. 
 227 | Print the grammar's useful rules on OUT.  | 
 228 `------------------------------------------*/ 
 231 grammar_rules_print (FILE *out
) 
 233   grammar_rules_partial_print (out
, _("Grammar"), rule_useful_p
); 
 237 /*-------------------. 
 238 | Dump the grammar.  | 
 239 `-------------------*/ 
 242 grammar_dump (FILE *out
, const char *title
) 
 244   fprintf (out
, "%s\n\n", title
); 
 246            "ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nritems = %d\n\n", 
 247            ntokens
, nvars
, nsyms
, nrules
, nritems
); 
 250   fprintf (out
, _("Variables\n---------\n\n")); 
 253     fprintf (out
, _("Value  Sprec  Sassoc  Tag\n")); 
 255     for (i 
= ntokens
; i 
< nsyms
; i
++) 
 256       fprintf (out
, "%5d  %5d   %5d  %s\n", 
 258                symbols
[i
]->prec
, symbols
[i
]->assoc
, 
 260     fprintf (out
, "\n\n"); 
 263   fprintf (out
, _("Rules\n-----\n\n")); 
 266     fprintf (out
, _("Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n")); 
 267     for (i 
= 0; i 
< nrules 
+ nuseless_productions
; i
++) 
 269         rule_t 
*rule 
= &rules
[i
]; 
 270         item_number_t 
*r 
= NULL
; 
 271         unsigned int rhs_itemno 
= rule
->rhs 
- ritem
; 
 272         unsigned int rhs_count 
= 0; 
 273         /* Find the last RHS index in ritems. */ 
 274         for (r 
= rule
->rhs
; *r 
>= 0; ++r
) 
 276         fprintf (out
, "%3d (%2d, %2d, %2d, %2u-%2u)   %2d ->", 
 278                  rule
->prec 
? rule
->prec
->prec 
: 0, 
 279                  rule
->prec 
? rule
->prec
->assoc 
: 0, 
 282                  rhs_itemno 
+ rhs_count 
- 1, 
 284         /* Dumped the RHS. */ 
 285         for (r 
= rule
->rhs
; *r 
>= 0; r
++) 
 286           fprintf (out
, " %3d", *r
); 
 287         fprintf (out
, "  [%d]\n", item_number_as_rule_number (*r
)); 
 290   fprintf (out
, "\n\n"); 
 292   fprintf (out
, _("Rules interpreted\n-----------------\n\n")); 
 295     for (r 
= 0; r 
< nrules 
+ nuseless_productions
; r
++) 
 297         fprintf (out
, "%-5d  ", r
); 
 298         rule_print (&rules
[r
], out
); 
 301   fprintf (out
, "\n\n"); 
 305 /*------------------------------------------------------------------. 
 306 | Report on STDERR the rules that are not flagged USEFUL, using the | 
 307 | MESSAGE (which can be `useless rule' when invoked after grammar   | 
 308 | reduction, or `never reduced' after conflicts were taken into     | 
 310 `------------------------------------------------------------------*/ 
 313 grammar_rules_never_reduced_report (const char *message
) 
 316   for (r 
= 0; r 
< nrules 
; ++r
) 
 317     if (!rules
[r
].useful
) 
 319         LOCATION_PRINT (stderr
, rules
[r
].location
); 
 320         fprintf (stderr
, ": %s: %s: ", 
 321                  _("warning"), message
); 
 322         rule_print (&rules
[r
], stderr
); 
 331   XFREE (token_translations
); 
 332   /* Free the symbol table data structure.  */ 
 334   free_merger_functions ();