]>
git.saurik.com Git - bison.git/blob - src/gram.c
   1 /* Allocate input grammar variables for Bison. 
   3    Copyright (C) 1984, 1986, 1989, 2001-2003, 2005-2012 Free Software 
   6    This file is part of Bison, the GNU Compiler Compiler. 
   8    This program is free software: you can redistribute it and/or modify 
   9    it under the terms of the GNU General Public License as published by 
  10    the Free Software Foundation, either version 3 of the License, or 
  11    (at your option) any later version. 
  13    This program is distributed in the hope that it will be useful, 
  14    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  16    GNU General Public License for more details. 
  18    You should have received a copy of the GNU General Public License 
  19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ 
  29 #include "print-xml.h" 
  34 /* Comments for these variables are in gram.h.  */ 
  36 item_number 
*ritem 
= NULL
; 
  37 unsigned int nritems 
= 0; 
  40 rule_number nrules 
= 0; 
  42 symbol 
**symbols 
= NULL
; 
  47 symbol_number 
*token_translations 
= NULL
; 
  49 int max_user_token_number 
= 256; 
  52 rule_useful_in_grammar_p (rule 
*r
) 
  54   return r
->number 
< nrules
; 
  58 rule_useless_in_grammar_p (rule 
*r
) 
  60   return !rule_useful_in_grammar_p (r
); 
  64 rule_useless_in_parser_p (rule 
*r
) 
  66   return !r
->useful 
&& rule_useful_in_grammar_p (r
); 
  70 rule_lhs_print (rule 
*r
, symbol 
*previous_lhs
, FILE *out
) 
  72   fprintf (out
, "  %3d ", r
->number
); 
  73   if (previous_lhs 
!= r
->lhs
) 
  75       fprintf (out
, "%s:", r
->lhs
->tag
); 
  80       for (n 
= strlen (previous_lhs
->tag
); n 
> 0; --n
) 
  87 rule_lhs_print_xml (rule 
*r
, FILE *out
, int level
) 
  89   xml_printf (out
, level
, "<lhs>%s</lhs>", r
->lhs
->tag
); 
  93 rule_rhs_length (rule 
*r
) 
  97   for (rhsp 
= r
->rhs
; *rhsp 
>= 0; ++rhsp
) 
 103 rule_rhs_print (rule 
*r
, FILE *out
) 
 108       for (rp 
= r
->rhs
; *rp 
>= 0; rp
++) 
 109         fprintf (out
, " %s", symbols
[*rp
]->tag
); 
 114       fprintf (out
, " /* %s */\n", _("empty")); 
 119 rule_rhs_print_xml (rule 
*r
, FILE *out
, int level
) 
 124       xml_puts (out
, level
, "<rhs>"); 
 125       for (rp 
= r
->rhs
; *rp 
>= 0; rp
++) 
 126         xml_printf (out
, level 
+ 1, "<symbol>%s</symbol>", 
 127                     xml_escape (symbols
[*rp
]->tag
)); 
 128       xml_puts (out
, level
, "</rhs>"); 
 132       xml_puts (out
, level
, "<rhs>"); 
 133       xml_puts (out
, level 
+ 1, "<empty/>"); 
 134       xml_puts (out
, level
, "</rhs>"); 
 139 rule_print (rule 
*r
, FILE *out
) 
 141   fprintf (out
, "%s:", r
->lhs
->tag
); 
 142   rule_rhs_print (r
, out
); 
 146 ritem_print (FILE *out
) 
 149   fputs ("RITEM\n", out
); 
 150   for (i 
= 0; i 
< nritems
; ++i
) 
 152       fprintf (out
, "  %s", symbols
[ritem
[i
]]->tag
); 
 154       fprintf (out
, "  (rule %d)\n", item_number_as_rule_number (ritem
[i
])); 
 159 ritem_longest_rhs (void) 
 164   for (r 
= 0; r 
< nrules
; ++r
) 
 166       int length 
= rule_rhs_length (&rules
[r
]); 
 175 grammar_rules_partial_print (FILE *out
, const char *title
, 
 180   symbol 
*previous_lhs 
= NULL
; 
 182   /* rule # : LHS -> RHS */ 
 183   for (r 
= 0; r 
< nrules 
+ nuseless_productions
; r
++) 
 185       if (filter 
&& !filter (&rules
[r
])) 
 188         fprintf (out
, "%s\n\n", title
); 
 189       else if (previous_lhs 
&& previous_lhs 
!= rules
[r
].lhs
) 
 192       rule_lhs_print (&rules
[r
], previous_lhs
, out
); 
 193       rule_rhs_print (&rules
[r
], out
); 
 194       previous_lhs 
= rules
[r
].lhs
; 
 201 grammar_rules_print (FILE *out
) 
 203   grammar_rules_partial_print (out
, _("Grammar"), rule_useful_in_grammar_p
); 
 207 grammar_rules_print_xml (FILE *out
, int level
) 
 212   for (r 
= 0; r 
< nrules 
+ nuseless_productions
; r
++) 
 215         xml_puts (out
, level 
+ 1, "<rules>"); 
 218         char const *usefulness
; 
 219         if (rule_useless_in_grammar_p (&rules
[r
])) 
 220           usefulness 
= "useless-in-grammar"; 
 221         else if (rule_useless_in_parser_p (&rules
[r
])) 
 222           usefulness 
= "useless-in-parser"; 
 224           usefulness 
= "useful"; 
 225         xml_indent (out
, level 
+ 2); 
 226         fprintf (out
, "<rule number=\"%d\" usefulness=\"%s\"", 
 227                  rules
[r
].number
, usefulness
); 
 228         if (rules
[r
].precsym
) 
 229           fprintf (out
, " percent_prec=\"%s\"", 
 230                    xml_escape (rules
[r
].precsym
->tag
)); 
 233       rule_lhs_print_xml (&rules
[r
], out
, level 
+ 3); 
 234       rule_rhs_print_xml (&rules
[r
], out
, level 
+ 3); 
 235       xml_puts (out
, level 
+ 2, "</rule>"); 
 238     xml_puts (out
, level 
+ 1, "</rules>"); 
 240    xml_puts (out
, level 
+ 1, "<rules/>"); 
 244 grammar_dump (FILE *out
, const char *title
) 
 246   fprintf (out
, "%s\n\n", title
); 
 248            "ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nritems = %d\n\n", 
 249            ntokens
, nvars
, nsyms
, nrules
, nritems
); 
 252   fprintf (out
, "Variables\n---------\n\n"); 
 255     fprintf (out
, "Value  Sprec  Sassoc  Tag\n"); 
 257     for (i 
= ntokens
; i 
< nsyms
; i
++) 
 258       fprintf (out
, "%5d  %5d   %5d  %s\n", 
 260                symbols
[i
]->prec
, symbols
[i
]->assoc
, 
 262     fprintf (out
, "\n\n"); 
 265   fprintf (out
, "Rules\n-----\n\n"); 
 268     fprintf (out
, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n"); 
 269     for (i 
= 0; i 
< nrules 
+ nuseless_productions
; i
++) 
 271         rule 
*rule_i 
= &rules
[i
]; 
 272         item_number 
*rp 
= NULL
; 
 273         unsigned int rhs_itemno 
= rule_i
->rhs 
- ritem
; 
 274         unsigned int rhs_count 
= 0; 
 275         /* Find the last RHS index in ritems. */ 
 276         for (rp 
= rule_i
->rhs
; *rp 
>= 0; ++rp
) 
 278         fprintf (out
, "%3d (%2d, %2d, %2d, %2u-%2u)   %2d ->", 
 280                  rule_i
->prec 
? rule_i
->prec
->prec 
: 0, 
 281                  rule_i
->prec 
? rule_i
->prec
->assoc 
: 0, 
 284                  rhs_itemno 
+ rhs_count 
- 1, 
 285                  rule_i
->lhs
->number
); 
 286         /* Dumped the RHS. */ 
 287         for (rp 
= rule_i
->rhs
; *rp 
>= 0; rp
++) 
 288           fprintf (out
, " %3d", *rp
); 
 289         fprintf (out
, "  [%d]\n", item_number_as_rule_number (*rp
)); 
 292   fprintf (out
, "\n\n"); 
 294   fprintf (out
, "Rules interpreted\n-----------------\n\n"); 
 297     for (r 
= 0; r 
< nrules 
+ nuseless_productions
; r
++) 
 299         fprintf (out
, "%-5d  ", r
); 
 300         rule_print (&rules
[r
], out
); 
 303   fprintf (out
, "\n\n"); 
 307 grammar_rules_useless_report (const char *message
) 
 310   for (r 
= 0; r 
< nrules 
; ++r
) 
 311     if (!rules
[r
].useful
) 
 313         warn_at (rules
[r
].location
, "%s: ", message
); 
 314         if (warnings_flag 
& warnings_other
) 
 316             rule_print (&rules
[r
], stderr
); 
 328   free (token_translations
); 
 329   /* Free the symbol table data structure.  */ 
 331   free_merger_functions ();