1 /* Input parser for bison 
   2    Copyright (C) 1984, 1986, 1989, 1992, 1998, 2000, 2001, 2002 
   3    Free Software Foundation, Inc. 
   5    This file is part of Bison, the GNU Compiler Compiler. 
   7    Bison is free software; you can redistribute it and/or modify 
   8    it under the terms of the GNU General Public License as published by 
   9    the Free Software Foundation; either version 2, or (at your option) 
  12    Bison is distributed in the hope that it will be useful, 
  13    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  15    GNU General Public License for more details. 
  17    You should have received a copy of the GNU General Public License 
  18    along with Bison; see the file COPYING.  If not, write to 
  19    the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
  20    Boston, MA 02111-1307, USA.  */ 
  35 #include "conflicts.h" 
  36 #include "muscle_tab.h" 
  38 typedef struct symbol_list
 
  40   struct symbol_list 
*next
; 
  44   /* The action is attached to the LHS of a rule. */ 
  48   /* The guard is attached to the LHS of a rule. */ 
  55 static symbol_list 
*grammar 
= NULL
; 
  56 static int start_flag 
= 0; 
  57 static symbol_t 
*startval 
= NULL
; 
  59 /* Nonzero if components of semantic values are used, implying 
  60    they must be unions.  */ 
  61 static int value_components_used
; 
  63 /* Nonzero if %union has been seen.  */ 
  66 /* Incremented for each %left, %right or %nonassoc seen */ 
  67 static int lastprec 
= 0; 
  69 symbol_t 
*errtoken 
= NULL
; 
  70 symbol_t 
*undeftoken 
= NULL
; 
  71 symbol_t 
*eoftoken 
= NULL
; 
  72 symbol_t 
*axiom 
= NULL
; 
  75 symbol_list_new (symbol_t 
*sym
) 
  77   symbol_list 
*res 
= XMALLOC (symbol_list
, 1); 
  89 /*------------------------. 
  90 | Operations on symbols.  | 
  91 `------------------------*/ 
  94 /*-----------------------------------------------------------. 
  95 | If THIS is not defined, report an error, and consider it a | 
  97 `-----------------------------------------------------------*/ 
 100 symbol_check_defined (symbol_t 
*this) 
 102   if (this->class == unknown_sym
) 
 105         (_("symbol %s is used, but is not defined as a token and has no rules"), 
 107       this->class = nterm_sym
; 
 108       this->number 
= nvars
++; 
 115 /*-------------------------------------------------------------------. 
 116 | Assign a symbol number, and write the definition of the token name | 
 117 | into FDEFINES.  Put in SYMBOLS.                                    | 
 118 `-------------------------------------------------------------------*/ 
 121 symbol_make_alias (symbol_t 
*symbol
, char *typename
) 
 124     warn (_("symbol `%s' used more than once as a literal string"), 
 126   else if (symbol
->alias
) 
 127     warn (_("symbol `%s' given more than one literal string"), 
 131       symval
->class = token_sym
; 
 132       symval
->type_name 
= typename
; 
 133       symval
->user_token_number 
= symbol
->user_token_number
; 
 134       symbol
->user_token_number 
= SALIAS
; 
 135       symval
->alias 
= symbol
; 
 136       symbol
->alias 
= symval
; 
 137       /* symbol and symval combined are only one symbol */ 
 140       assert (ntokens 
== symbol
->number 
|| ntokens 
== symval
->number
); 
 141       symbol
->number 
= symval
->number 
= 
 142         (symval
->number 
< symbol
->number
) ? symval
->number 
: symbol
->number
; 
 148 /*---------------------------------------------------------. 
 149 | Check that THIS, and its alias, have same precedence and | 
 151 `---------------------------------------------------------*/ 
 154 symbol_check_alias_consistence (symbol_t 
*this) 
 156   /* Check only those who _are_ the aliases. */ 
 157   if (this->alias 
&& this->user_token_number 
== SALIAS
) 
 159       if (this->prec 
!= this->alias
->prec
) 
 161           if (this->prec 
!= 0 && this->alias
->prec 
!= 0) 
 162             complain (_("conflicting precedences for %s and %s"), 
 163                       this->tag
, this->alias
->tag
); 
 165             this->alias
->prec 
= this->prec
; 
 167             this->prec 
= this->alias
->prec
; 
 170       if (this->assoc 
!= this->alias
->assoc
) 
 172           if (this->assoc 
!= 0 && this->alias
->assoc 
!= 0) 
 173             complain (_("conflicting assoc values for %s and %s"), 
 174                       this->tag
, this->alias
->tag
); 
 175           if (this->assoc 
!= 0) 
 176             this->alias
->assoc 
= this->assoc
; 
 178             this->assoc 
= this->alias
->assoc
; 
 185 /*-------------------------------------------------------------------. 
 186 | Assign a symbol number, and write the definition of the token name | 
 187 | into FDEFINES.  Put in SYMBOLS.                                    | 
 188 `-------------------------------------------------------------------*/ 
 191 symbol_pack (symbol_t 
*this) 
 193   if (this->class == nterm_sym
) 
 195       this->number 
+= ntokens
; 
 197   else if (this->alias
) 
 199       /* This symbol and its alias are a single token defn. 
 200          Allocate a tokno, and assign to both check agreement of 
 201          prec and assoc fields and make both the same */ 
 202       if (this->number 
== -1) 
 204           if (this == eoftoken 
|| this->alias 
== eoftoken
) 
 205             this->number 
= this->alias
->number 
= 0; 
 208               assert (this->alias
->number 
!= -1); 
 209               this->number 
= this->alias
->number
; 
 212       /* Do not do processing below for SALIASs.  */ 
 213       if (this->user_token_number 
== SALIAS
) 
 216   else /* this->class == token_sym */ 
 218       assert (this->number 
!= -1); 
 221   symbols
[this->number
] = this; 
 228 /*--------------------------------------------------. 
 229 | Put THIS in TOKEN_TRANSLATIONS if it is a token.  | 
 230 `--------------------------------------------------*/ 
 233 symbol_translation (symbol_t 
*this) 
 236   if (this->class == token_sym
 
 237       && this->user_token_number 
!= SALIAS
) 
 239       /* A token which translation has already been set? */ 
 240       if (token_translations
[this->user_token_number
] != 2) 
 241         complain (_("tokens %s and %s both assigned number %d"), 
 242                   symbols
[token_translations
[this->user_token_number
]]->tag
, 
 243                   this->tag
, this->user_token_number
); 
 245       token_translations
[this->user_token_number
] = this->number
; 
 252 /*===================\ 
 253 | Low level lexing.  | 
 254 \===================*/ 
 257 skip_to_char (int target
) 
 261     complain (_("   Skipping to next \\n")); 
 263     complain (_("   Skipping to next %c"), target
); 
 266     c 
= skip_white_space (); 
 267   while (c 
!= target 
&& c 
!= EOF
); 
 273 /*---------------------------------------------------------. 
 274 | Read a signed integer from STREAM and return its value.  | 
 275 `---------------------------------------------------------*/ 
 278 read_signed_integer (FILE *stream
) 
 280   int c 
= getc (stream
); 
 292       n 
= 10 * n 
+ (c 
- '0'); 
 301 /*--------------------------------------------------------------. 
 302 | Get the data type (alternative in the union) of the value for | 
 303 | symbol N in rule RULE.                                        | 
 304 `--------------------------------------------------------------*/ 
 307 get_type_name (int n
, symbol_list 
*rule
) 
 314       complain (_("invalid $ value")); 
 324       if (rp 
== NULL 
|| rp
->sym 
== NULL
) 
 326           complain (_("invalid $ value")); 
 332   return rp
->sym
->type_name
; 
 335 /*------------------------------------------------------------. 
 336 | Dump the string from FIN to OOUT if non null.  MATCH is the | 
 337 | delimiter of the string (either ' or ").                    | 
 338 `------------------------------------------------------------*/ 
 341 copy_string2 (FILE *fin
, struct obstack 
*oout
, int match
, int store
) 
 346     obstack_1grow (oout
, match
); 
 353         fatal (_("unterminated string at end of file")); 
 356           complain (_("unterminated string")); 
 358           c 
= match
;            /* invent terminator */ 
 362       obstack_1grow (oout
, c
); 
 368             fatal (_("unterminated string at end of file")); 
 369           obstack_1grow (oout
, c
); 
 379     obstack_1grow (oout
, c
); 
 385 copy_string (FILE *fin
, struct obstack 
*oout
, int match
) 
 387   copy_string2 (fin
, oout
, match
, 1); 
 393 copy_identifier (FILE *fin
, struct obstack 
*oout
) 
 397   while (isalnum (c 
= getc (fin
)) || c 
== '_') 
 398     obstack_1grow (oout
, c
); 
 404 /*------------------------------------------------------------------. 
 405 | Dump the wannabee comment from IN to OOUT.  In fact we just saw a | 
 406 | `/', which might or might not be a comment.  In any case, copy    | 
 408 `------------------------------------------------------------------*/ 
 411 copy_comment (FILE *fin
, struct obstack 
*oout
) 
 417   /* We read a `/', output it. */ 
 418   obstack_1grow (oout
, '/'); 
 420   switch ((c 
= getc (fin
))) 
 433   obstack_1grow (oout
, c
); 
 439       if (!cplus_comment 
&& c 
== '*') 
 443               obstack_1grow (oout
, c
); 
 449               obstack_1grow (oout
, c
); 
 456           obstack_1grow (oout
, c
); 
 463         fatal (_("unterminated comment")); 
 466           obstack_1grow (oout
, c
); 
 473 /*-----------------------------------------------------------------. 
 474 | FIN is pointing to a location (i.e., a `@').  Output to OOUT a   | 
 475 | reference to this location. STACK_OFFSET is the number of values | 
 476 | in the current rule so far, which says where to find `$0' with   | 
 477 | respect to the top of the stack.                                 | 
 478 `-----------------------------------------------------------------*/ 
 481 copy_at (FILE *fin
, struct obstack 
*oout
, int stack_offset
) 
 488       obstack_sgrow (oout
, "yyloc"); 
 491   else if (isdigit (c
) || c 
== '-') 
 496       n 
= read_signed_integer (fin
); 
 497       if (n 
> stack_offset
) 
 498         complain (_("invalid value: %s%d"), "@", n
); 
 501           /* Offset is always 0 if parser has already popped the stack 
 503           obstack_fgrow1 (oout
, "yylsp[%d]", 
 504                           n 
- (semantic_parser 
? 0 : stack_offset
)); 
 512       complain (_("%s is invalid"), quote (buf
)); 
 517 /*-------------------------------------------------------------------. 
 518 | FIN is pointing to a wannabee semantic value (i.e., a `$').        | 
 520 | Possible inputs: $[<TYPENAME>]($|integer)                          | 
 522 | Output to OOUT a reference to this semantic value. STACK_OFFSET is | 
 523 | the number of values in the current rule so far, which says where  | 
 524 | to find `$0' with respect to the top of the stack.                 | 
 525 `-------------------------------------------------------------------*/ 
 528 copy_dollar (FILE *fin
, struct obstack 
*oout
, 
 529              symbol_list 
*rule
, int stack_offset
) 
 532   const char *type_name 
= NULL
; 
 534   /* Get the type name if explicit. */ 
 537       read_type_name (fin
); 
 538       type_name 
= token_buffer
; 
 539       value_components_used 
= 1; 
 545       obstack_sgrow (oout
, "yyval"); 
 548         type_name 
= get_type_name (0, rule
); 
 550         obstack_fgrow1 (oout
, ".%s", type_name
); 
 551       if (!type_name 
&& typed
) 
 552         complain (_("$$ of `%s' has no declared type"), 
 555   else if (isdigit (c
) || c 
== '-') 
 559       n 
= read_signed_integer (fin
); 
 561       if (n 
> stack_offset
) 
 562         complain (_("invalid value: %s%d"), "$", n
); 
 565           if (!type_name 
&& n 
> 0) 
 566             type_name 
= get_type_name (n
, rule
); 
 568           /* Offset is always 0 if parser has already popped the stack 
 570           obstack_fgrow1 (oout
, "yyvsp[%d]", 
 571                           n 
- (semantic_parser 
? 0 : stack_offset
)); 
 574             obstack_fgrow1 (oout
, ".%s", type_name
); 
 575           if (!type_name 
&& typed
) 
 576             complain (_("$%d of `%s' has no declared type"), 
 584       complain (_("%s is invalid"), quote (buf
)); 
 588 /*-------------------------------------------------------------------. 
 589 | Copy the contents of a `%{ ... %}' into the definitions file.  The | 
 590 | `%{' has already been read.  Return after reading the `%}'.        | 
 591 `-------------------------------------------------------------------*/ 
 594 copy_definition (void) 
 597   /* -1 while reading a character if prev char was %. */ 
 602       obstack_fgrow2 (&attrs_obstack
, muscle_find ("linef"), 
 603                       lineno
, quotearg_style (c_quoting_style
, 
 604                                               muscle_find ("filename"))); 
 616           obstack_1grow (&attrs_obstack
, c
); 
 626           copy_string (finput
, &attrs_obstack
, c
); 
 630           copy_comment (finput
, &attrs_obstack
); 
 634           fatal ("%s", _("unterminated `%{' definition")); 
 637           obstack_1grow (&attrs_obstack
, c
); 
 646           obstack_1grow (&attrs_obstack
, '%'); 
 653 /*-------------------------------------------------------------------. 
 654 | Parse what comes after %token or %nterm.  For %token, WHAT_IS is   | 
 655 | token_sym and WHAT_IS_NOT is nterm_sym.  For %nterm, the arguments | 
 657 `-------------------------------------------------------------------*/ 
 660 parse_token_decl (symbol_class what_is
, symbol_class what_is_not
) 
 662   token_t token 
= tok_undef
; 
 663   char *typename 
= NULL
; 
 665   /* The symbol being defined.  */ 
 666   symbol_t 
*symbol 
= NULL
; 
 668   /* After `%token' and `%nterm', any number of symbols maybe be 
 672       int tmp_char 
= ungetc (skip_white_space (), finput
); 
 674       /* `%' (for instance from `%token', or from `%%' etc.) is the 
 675          only valid means to end this declaration.  */ 
 679         fatal (_("Premature EOF after %s"), token_buffer
); 
 682       if (token 
== tok_comma
) 
 687       if (token 
== tok_typename
) 
 689           typename 
= xstrdup (token_buffer
); 
 690           value_components_used 
= 1; 
 693       else if (token 
== tok_identifier 
&& *symval
->tag 
== '\"' && symbol
) 
 695           symbol_make_alias (symbol
, typename
); 
 698       else if (token 
== tok_identifier
) 
 700           int oldclass 
= symval
->class; 
 703           if (symbol
->class == what_is_not
) 
 704             complain (_("symbol %s redefined"), symbol
->tag
); 
 705           symbol
->class = what_is
; 
 706           if (what_is 
== nterm_sym 
&& oldclass 
!= nterm_sym
) 
 707             symbol
->number 
= nvars
++; 
 708           if (what_is 
== token_sym 
&& symbol
->number 
== -1) 
 709             symbol
->number 
= ntokens
++; 
 713               if (symbol
->type_name 
== NULL
) 
 714                 symbol
->type_name 
= typename
; 
 715               else if (strcmp (typename
, symbol
->type_name
) != 0) 
 716                 complain (_("type redeclaration for %s"), symbol
->tag
); 
 719       else if (symbol 
&& token 
== tok_number
) 
 721           symbol
->user_token_number 
= numval
; 
 722           /* User defined EOF token? */ 
 726               eoftoken
->number 
= 0; 
 727               /* It is always mapped to 0, so it was already counted in 
 734           complain (_("`%s' is invalid in %s"), 
 736                     (what_is 
== token_sym
) ? "%token" : "%nterm"); 
 744 /*------------------------------. 
 745 | Parse what comes after %start | 
 746 `------------------------------*/ 
 749 parse_start_decl (void) 
 752     complain (_("multiple %s declarations"), "%start"); 
 753   if (lex () != tok_identifier
) 
 754     complain (_("invalid %s declaration"), "%start"); 
 762 /*-----------------------------------------------------------. 
 763 | read in a %type declaration and record its information for | 
 764 | get_type_name to access                                    | 
 765 `-----------------------------------------------------------*/ 
 768 parse_type_decl (void) 
 772   if (lex () != tok_typename
) 
 774       complain ("%s", _("%type declaration has no <typename>")); 
 779   name 
= xstrdup (token_buffer
); 
 784       int tmp_char 
= ungetc (skip_white_space (), finput
); 
 789         fatal (_("Premature EOF after %s"), token_buffer
); 
 801           if (symval
->type_name 
== NULL
) 
 802             symval
->type_name 
= name
; 
 803           else if (strcmp (name
, symval
->type_name
) != 0) 
 804             complain (_("type redeclaration for %s"), symval
->tag
); 
 809           complain (_("invalid %%type declaration due to item: %s"), 
 818 /*----------------------------------------------------------------. 
 819 | Read in a %left, %right or %nonassoc declaration and record its | 
 821 `----------------------------------------------------------------*/ 
 824 parse_assoc_decl (associativity assoc
) 
 829   lastprec
++;                   /* Assign a new precedence level, never 0.  */ 
 834       int tmp_char 
= ungetc (skip_white_space (), finput
); 
 839         fatal (_("Premature EOF after %s"), token_buffer
); 
 846           name 
= xstrdup (token_buffer
); 
 853           if (symval
->prec 
!= 0) 
 854             complain (_("redefining precedence of %s"), symval
->tag
); 
 855           symval
->prec 
= lastprec
; 
 856           symval
->assoc 
= assoc
; 
 857           if (symval
->class == nterm_sym
) 
 858             complain (_("symbol %s redefined"), symval
->tag
); 
 859           if (symval
->number 
== -1) 
 861               symval
->number 
= ntokens
++; 
 862               symval
->class = token_sym
; 
 865             {                   /* record the type, if one is specified */ 
 866               if (symval
->type_name 
== NULL
) 
 867                 symval
->type_name 
= name
; 
 868               else if (strcmp (name
, symval
->type_name
) != 0) 
 869                 complain (_("type redeclaration for %s"), symval
->tag
); 
 874           if (prev 
== tok_identifier
) 
 876               symval
->user_token_number 
= numval
; 
 881                 (_("invalid text (%s) - number should be after identifier"), 
 891           complain (_("unexpected item: %s"), token_buffer
); 
 901 /*--------------------------------------------------------------. 
 902 | Copy the union declaration into the stype muscle              | 
 903 | (and fdefines),  where it is made into the definition of      | 
 904 | YYSTYPE, the type of elements of the parser value stack.      | 
 905 `--------------------------------------------------------------*/ 
 908 parse_union_decl (void) 
 913   struct obstack union_obstack
; 
 915     complain (_("multiple %s declarations"), "%union"); 
 919   MUSCLE_INSERT_INT ("stype_line", lineno
); 
 920   obstack_init (&union_obstack
); 
 921   obstack_sgrow (&union_obstack
, "union"); 
 927       /* If C contains '/', it is output by copy_comment ().  */ 
 929         obstack_1grow (&union_obstack
, c
); 
 938           copy_comment (finput
, &union_obstack
); 
 946           /* FIXME: Errr.  How could this happen???. --akim */ 
 948             complain (_("unmatched %s"), "`}'"); 
 956   /* JF don't choke on trailing semi */ 
 957   c 
= skip_white_space (); 
 960   obstack_1grow (&union_obstack
, 0); 
 961   muscle_insert ("stype", obstack_finish (&union_obstack
)); 
 965 /*-------------------------------------------------------. 
 966 | Parse the declaration %expect N which says to expect N | 
 967 | shift-reduce conflicts.                                | 
 968 `-------------------------------------------------------*/ 
 971 parse_expect_decl (void) 
 973   int c 
= skip_white_space (); 
 977     complain (_("argument of %%expect is not an integer")); 
 979     expected_conflicts 
= read_signed_integer (finput
); 
 983 /*-------------------------------------------------------------------. 
 984 | Parse what comes after %thong.  the full syntax is                 | 
 986 |                %thong <type> token number literal                  | 
 988 | the <type> or number may be omitted.  The number specifies the     | 
 989 | user_token_number.                                                 | 
 991 | Two symbols are entered in the table, one for the token symbol and | 
 992 | one for the literal.  Both are given the <type>, if any, from the  | 
 993 | declaration.  The ->user_token_number of the first is SALIAS and   | 
 994 | the ->user_token_number of the second is set to the number, if     | 
 995 | any, from the declaration.  The two symbols are linked via         | 
 996 | pointers in their ->alias fields.                                  | 
 998 | During OUTPUT_DEFINES_TABLE, the symbol is reported thereafter,    | 
 999 | only the literal string is retained it is the literal string that  | 
1000 | is output to yytname                                               | 
1001 `-------------------------------------------------------------------*/ 
1004 parse_thong_decl (void) 
1009   int usrtoknum 
= SUNDEF
; 
1011   token 
= lex ();               /* fetch typename or first token */ 
1012   if (token 
== tok_typename
) 
1014       typename 
= xstrdup (token_buffer
); 
1015       value_components_used 
= 1; 
1016       token 
= lex ();           /* fetch first token */ 
1019   /* process first token */ 
1021   if (token 
!= tok_identifier
) 
1023       complain (_("unrecognized item %s, expected an identifier"), 
1028   symval
->class = token_sym
; 
1029   symval
->type_name 
= typename
; 
1030   symval
->user_token_number 
= SALIAS
; 
1033   token 
= lex ();               /* get number or literal string */ 
1035   if (token 
== tok_number
) 
1038       token 
= lex ();           /* okay, did number, now get literal */ 
1041   /* process literal string token */ 
1043   if (token 
!= tok_identifier 
|| *symval
->tag 
!= '\"') 
1045       complain (_("expected string constant instead of %s"), token_buffer
); 
1049   symval
->class = token_sym
; 
1050   symval
->type_name 
= typename
; 
1051   symval
->user_token_number 
= usrtoknum
; 
1053   symval
->alias 
= symbol
; 
1054   symbol
->alias 
= symval
; 
1056   /* symbol and symval combined are only one symbol.  */ 
1062 parse_muscle_decl (void) 
1064   int ch 
= ungetc (skip_white_space (), finput
); 
1069   if (!isalpha (ch
) && ch 
!= '_') 
1071       complain (_("invalid %s declaration"), "%define"); 
1075   copy_identifier (finput
, &muscle_obstack
); 
1076   obstack_1grow (&muscle_obstack
, 0); 
1077   muscle_key 
= obstack_finish (&muscle_obstack
); 
1080   ch 
= skip_white_space (); 
1083       ungetc (ch
, finput
); 
1086           complain (_("invalid %s declaration"), "%define"); 
1091         fatal (_("Premature EOF after %s"), "\""); 
1093   copy_string2 (finput
, &muscle_obstack
, '"', 0); 
1094   obstack_1grow (&muscle_obstack
, 0); 
1095   muscle_value 
= obstack_finish (&muscle_obstack
); 
1097   /* Store the (key, value) pair in the environment. */ 
1098   muscle_insert (muscle_key
, muscle_value
); 
1103 /*---------------------------------. 
1104 | Parse a double quoted parameter. | 
1105 `---------------------------------*/ 
1108 parse_dquoted_param (const char *from
) 
1110   struct obstack param_obstack
; 
1111   const char *param 
= NULL
; 
1114   obstack_init (¶m_obstack
); 
1115   c 
= skip_white_space (); 
1119       complain (_("invalid %s declaration"), from
); 
1125   while ((c 
= literalchar ()) != '"') 
1126     obstack_1grow (¶m_obstack
, c
); 
1128   obstack_1grow (¶m_obstack
, '\0'); 
1129   param 
= obstack_finish (¶m_obstack
); 
1131   if (c 
!= '"' || strlen (param
) == 0) 
1133       complain (_("invalid %s declaration"), from
); 
1143 /*----------------------------------. 
1144 | Parse what comes after %skeleton. | 
1145 `----------------------------------*/ 
1148 parse_skel_decl (void) 
1150   skeleton 
= parse_dquoted_param ("%skeleton"); 
1153 /*----------------------------------------------------------------. 
1154 | Read from finput until `%%' is seen.  Discard the `%%'.  Handle | 
1155 | any `%' declarations, and copy the contents of any `%{ ... %}'  | 
1156 | groups to ATTRS_OBSTACK.                                        | 
1157 `----------------------------------------------------------------*/ 
1160 read_declarations (void) 
1164       int c 
= skip_white_space (); 
1168           token_t tok 
= parse_percent_token (); 
1172             case tok_two_percents
: 
1175             case tok_percent_left_curly
: 
1180               parse_token_decl (token_sym
, nterm_sym
); 
1184               parse_token_decl (nterm_sym
, token_sym
); 
1192               parse_start_decl (); 
1196               parse_union_decl (); 
1200               parse_expect_decl (); 
1204               parse_thong_decl (); 
1208               parse_assoc_decl (left_assoc
); 
1212               parse_assoc_decl (right_assoc
); 
1216               parse_assoc_decl (non_assoc
); 
1220               parse_muscle_decl (); 
1238               complain (_("unrecognized: %s"), token_buffer
); 
1243         fatal (_("no input grammar")); 
1248           complain (_("unknown character: %s"), quote (buf
)); 
1254 /*-------------------------------------------------------------------. 
1255 | Assuming that a `{' has just been seen, copy everything up to the  | 
1256 | matching `}' into the actions file.  STACK_OFFSET is the number of | 
1257 | values in the current rule so far, which says where to find `$0'   | 
1258 | with respect to the top of the stack.                              | 
1260 | This routine is used both for actions and guards.  Only            | 
1261 | ACTION_OBSTACK is used, but this is fine, since we use only        | 
1262 | pointers to relevant portions inside this obstack.                 | 
1263 `-------------------------------------------------------------------*/ 
1266 parse_braces (symbol_list 
*rule
, int stack_offset
) 
1274       while ((c 
= getc (finput
)) != '}') 
1278             obstack_1grow (&action_obstack
, c
); 
1283             obstack_1grow (&action_obstack
, c
); 
1289             copy_string (finput
, &action_obstack
, c
); 
1293             copy_comment (finput
, &action_obstack
); 
1297             copy_dollar (finput
, &action_obstack
, 
1298                          rule
, stack_offset
); 
1302             copy_at (finput
, &action_obstack
, 
1307             fatal (_("unmatched %s"), "`{'"); 
1310             obstack_1grow (&action_obstack
, c
); 
1313       /* Above loop exits when C is '}'.  */ 
1315         obstack_1grow (&action_obstack
, c
); 
1318   obstack_1grow (&action_obstack
, '\0'); 
1323 parse_action (symbol_list 
*rule
, int stack_offset
) 
1325   rule
->action_line 
= lineno
; 
1326   parse_braces (rule
, stack_offset
); 
1327   rule
->action 
= obstack_finish (&action_obstack
); 
1332 parse_guard (symbol_list 
*rule
, int stack_offset
) 
1335   if (t 
!= tok_left_curly
) 
1336     complain (_("invalid %s declaration"), "%guard"); 
1337   rule
->guard_line 
= lineno
; 
1338   parse_braces (rule
, stack_offset
); 
1339   rule
->guard 
= obstack_finish (&action_obstack
); 
1344 /*-------------------------------------------------------------------. 
1345 | Generate a dummy symbol, a nonterminal, whose name cannot conflict | 
1346 | with the user's names.                                             | 
1347 `-------------------------------------------------------------------*/ 
1352   /* Incremented for each generated symbol */ 
1353   static int gensym_count 
= 0; 
1354   static char buf
[256]; 
1358   sprintf (buf
, "@%d", ++gensym_count
); 
1360   sym 
= getsym (token_buffer
); 
1361   sym
->class = nterm_sym
; 
1362   sym
->number 
= nvars
++; 
1366 /*-------------------------------------------------------------------. 
1367 | Parse the input grammar into a one symbol_list structure.  Each    | 
1368 | rule is represented by a sequence of symbols: the left hand side   | 
1369 | followed by the contents of the right hand side, followed by a     | 
1370 | null pointer instead of a symbol to terminate the rule.  The next  | 
1371 | symbol is the lhs of the following rule.                           | 
1373 | All guards and actions are copied out to the appropriate files,    | 
1374 | labelled by the rule number they apply to.                         | 
1376 | Bison used to allow some %directives in the rules sections, but    | 
1377 | this is no longer consider appropriate: (i) the documented grammar | 
1378 | doesn't claim it, (ii), it would promote bad style, (iii), error   | 
1379 | recovery for %directives consists in skipping the junk until a `%' | 
1380 | is seen and helrp synchronizing.  This scheme is definitely wrong  | 
1381 | in the rules section.                                              | 
1382 `-------------------------------------------------------------------*/ 
1388   symbol_t 
*lhs 
= NULL
; 
1389   symbol_list 
*p 
= NULL
; 
1390   symbol_list 
*p1 
= NULL
; 
1392   /* Points to first symbol_list of current rule. its symbol is the 
1394   symbol_list 
*crule 
= NULL
; 
1395   /* Points to the symbol_list preceding crule.  */ 
1396   symbol_list 
*crule1 
= NULL
; 
1400   while (t 
!= tok_two_percents 
&& t 
!= tok_eof
) 
1401     if (t 
== tok_identifier 
|| t 
== tok_bar
) 
1403         int action_flag 
= 0; 
1404         /* Number of symbols in rhs of this rule so far */ 
1406         int xactions 
= 0;       /* JF for error checking */ 
1407         symbol_t 
*first_rhs 
= 0; 
1409         if (t 
== tok_identifier
) 
1422                 complain (_("ill-formed rule: initial symbol not followed by colon")); 
1427         if (nrules 
== 0 && t 
== tok_bar
) 
1429             complain (_("grammar starts with vertical bar")); 
1430             lhs 
= symval
;       /* BOGUS: use a random symval */ 
1432         /* start a new rule and record its lhs.  */ 
1437         p 
= symbol_list_new (lhs
); 
1448         /* mark the rule's lhs as a nonterminal if not already so.  */ 
1450         if (lhs
->class == unknown_sym
) 
1452             lhs
->class = nterm_sym
; 
1453             lhs
->number 
= nvars
; 
1456         else if (lhs
->class == token_sym
) 
1457           complain (_("rule given for %s, which is a token"), lhs
->tag
); 
1459         /* read the rhs of the rule.  */ 
1467                 crule
->ruleprec 
= symval
; 
1471             if (!(t 
== tok_identifier 
|| t 
== tok_left_curly
)) 
1474             /* If next token is an identifier, see if a colon follows it. 
1475                If one does, exit this rule now.  */ 
1476             if (t 
== tok_identifier
) 
1485                 if (t1 
== tok_colon
) 
1487                     warn (_("previous rule lacks an ending `;'")); 
1491                 if (!first_rhs
) /* JF */ 
1493                 /* Not followed by colon => 
1494                    process as part of this rule's rhs.  */ 
1497             /* If we just passed an action, that action was in the middle 
1498                of a rule, so make a dummy rule to reduce it to a 
1502                 /* Since the action was written out with this rule's 
1503                    number, we must give the new rule this number by 
1504                    inserting the new rule before it.  */ 
1506                 /* Make a dummy nonterminal, a gensym.  */ 
1507                 symbol_t 
*sdummy 
= gensym (); 
1509                 /* Make a new rule, whose body is empty, before the 
1510                    current one, so that the action just read can 
1514                 p 
= symbol_list_new (sdummy
); 
1515                 /* Attach its lineno to that of the host rule. */ 
1516                 p
->line 
= crule
->line
; 
1517                 /* Move the action from the host rule to this one. */ 
1518                 p
->action 
= crule
->action
; 
1519                 p
->action_line 
= crule
->action_line
; 
1520                 crule
->action 
= NULL
; 
1526                 /* End of the rule. */ 
1527                 crule1 
= symbol_list_new (NULL
); 
1528                 crule1
->next 
= crule
; 
1532                 /* Insert the dummy generated by that rule into this 
1535                 p 
= symbol_list_new (sdummy
); 
1542             if (t 
== tok_identifier
) 
1545                 p 
= symbol_list_new (symval
); 
1549             else                /* handle an action.  */ 
1551                 parse_action (crule
, rulelength
); 
1553                 xactions
++;     /* JF */ 
1556           }                     /* end of  read rhs of rule */ 
1558         /* Put an empty link in the list to mark the end of this rule  */ 
1559         p 
= symbol_list_new (NULL
); 
1565             complain (_("two @prec's in a row")); 
1567             crule
->ruleprec 
= symval
; 
1573             if (!semantic_parser
) 
1574               complain (_("%%guard present but %%semantic_parser not specified")); 
1576             parse_guard (crule
, rulelength
); 
1580         if (t 
== tok_left_curly
) 
1582             /* This case never occurs -wjh */ 
1584               complain (_("two actions at end of one rule")); 
1585             parse_action (crule
, rulelength
); 
1587             xactions
++; /* -wjh */ 
1590         /* If $$ is being set in default way, report if any type 
1593                  && first_rhs 
&& lhs
->type_name 
!= first_rhs
->type_name
) 
1595             if (lhs
->type_name 
== 0 
1596                 || first_rhs
->type_name 
== 0 
1597                 || strcmp (lhs
->type_name
, first_rhs
->type_name
)) 
1598               complain (_("type clash (`%s' `%s') on default action"), 
1599                         lhs
->type_name 
? lhs
->type_name 
: "", 
1600                         first_rhs
->type_name 
? first_rhs
->type_name 
: ""); 
1602         /* Warn if there is no default for $$ but we need one.  */ 
1603         else if (!xactions 
&& !first_rhs 
&& lhs
->type_name 
!= 0) 
1604           complain (_("empty rule for typed nonterminal, and no action")); 
1605         if (t 
== tok_two_percents 
|| t 
== tok_eof
) 
1606           warn (_("previous rule lacks an ending `;'")); 
1607         if (t 
== tok_semicolon
) 
1612         complain (_("invalid input: %s"), quote (token_buffer
)); 
1616   /* grammar has been read.  Do some checking */ 
1619     fatal (_("no rules in the input grammar")); 
1621   /* Report any undefined symbols and consider them nonterminals.  */ 
1622   symbols_do (symbol_check_defined
, NULL
); 
1624   /* Insert the initial rule, which line is that of the first rule 
1625      (not that of the start symbol): 
1627      axiom: %start EOF.  */ 
1628   p 
= symbol_list_new (axiom
); 
1629   p
->line 
= grammar
->line
; 
1630   p
->next 
= symbol_list_new (startval
); 
1631   p
->next
->next 
= symbol_list_new (eoftoken
); 
1632   p
->next
->next
->next 
= symbol_list_new (NULL
); 
1633   p
->next
->next
->next
->next 
= grammar
; 
1639   if (nsyms 
> MAXSHORT
) 
1640     fatal (_("too many symbols (tokens plus nonterminals); maximum %d"), 
1643   assert (nsyms 
== ntokens 
+ nvars
); 
1646 /* At the end of the grammar file, some C source code must 
1647    be stored. It is going to be associated to the epilogue 
1650 read_additionnal_code (void) 
1653   struct obstack el_obstack
; 
1655   obstack_init (&el_obstack
); 
1659       obstack_fgrow2 (&el_obstack
, muscle_find ("linef"), 
1660                       lineno
, quotearg_style (c_quoting_style
, 
1661                                               muscle_find ("filename"))); 
1664   while ((c 
= getc (finput
)) != EOF
) 
1665     obstack_1grow (&el_obstack
, c
); 
1667   obstack_1grow (&el_obstack
, 0); 
1668   muscle_insert ("epilogue", obstack_finish (&el_obstack
)); 
1672 /*------------------------------------------------------------------. 
1673 | Set TOKEN_TRANSLATIONS.  Check that no two symbols share the same | 
1675 `------------------------------------------------------------------*/ 
1678 token_translations_init (void) 
1680   int last_user_token_number 
= 256; 
1683   /* Set the user numbers. */ 
1684   for (i 
= 0; i 
< ntokens
; ++i
) 
1686       symbol_t 
*this = symbols
[i
]; 
1687       if (this->user_token_number 
== SUNDEF
) 
1688         this->user_token_number 
= ++last_user_token_number
; 
1689       if (this->user_token_number 
> max_user_token_number
) 
1690         max_user_token_number 
= this->user_token_number
; 
1693   token_translations 
= XCALLOC (short, max_user_token_number 
+ 1); 
1695   /* Initialize all entries for literal tokens to 2, the internal 
1696      token number for $undefined., which represents all invalid 
1698   for (i 
= 0; i 
< max_user_token_number 
+ 1; i
++) 
1699     token_translations
[i
] = 2; 
1701   symbols_do (symbol_translation
, NULL
); 
1705 /*----------------------------------------------------------------. 
1706 | Assign symbol numbers, and write definition of token names into | 
1707 | FDEFINES.  Set up vectors SYMBOL_TABLE, TAGS of symbols.        | 
1708 `----------------------------------------------------------------*/ 
1713   symbols 
= XCALLOC (symbol_t 
*, nsyms
); 
1715   symbols_do (symbol_check_alias_consistence
, NULL
); 
1716   symbols_do (symbol_pack
, NULL
); 
1718   token_translations_init (); 
1720   error_token_number 
= errtoken
->number
; 
1722   if (startval
->class == unknown_sym
) 
1723     fatal (_("the start symbol %s is undefined"), startval
->tag
); 
1724   else if (startval
->class == token_sym
) 
1725     fatal (_("the start symbol %s is a token"), startval
->tag
); 
1727   start_symbol 
= startval
->number
; 
1731 /*---------------------------------------------------------------. 
1732 | Convert the rules into the representation using RRHS, RLHS and | 
1734 `---------------------------------------------------------------*/ 
1743   /* We use short to index items.  */ 
1744   if (nitems 
>= MAXSHORT
) 
1745     fatal (_("too many items (max %d)"), MAXSHORT
); 
1747   ritem 
= XCALLOC (short, nitems 
+ 1); 
1748   rules 
= XCALLOC (rule_t
, nrules
) - 1; 
1756       symbol_t 
*ruleprec 
= p
->ruleprec
; 
1757       rules
[ruleno
].user_number 
= ruleno
; 
1758       rules
[ruleno
].number 
= ruleno
; 
1759       rules
[ruleno
].lhs 
= p
->sym
; 
1760       rules
[ruleno
].rhs 
= ritem 
+ itemno
; 
1761       rules
[ruleno
].line 
= p
->line
; 
1762       rules
[ruleno
].useful 
= TRUE
; 
1763       rules
[ruleno
].action 
= p
->action
; 
1764       rules
[ruleno
].action_line 
= p
->action_line
; 
1765       rules
[ruleno
].guard 
= p
->guard
; 
1766       rules
[ruleno
].guard_line 
= p
->guard_line
; 
1771           ritem
[itemno
++] = p
->sym
->number
; 
1772           /* A rule gets by default the precedence and associativity 
1773              of the last token in it.  */ 
1774           if (p
->sym
->class == token_sym
) 
1775             rules
[ruleno
].prec 
= p
->sym
; 
1780       /* If this rule has a %prec, 
1781          the specified symbol's precedence replaces the default.  */ 
1784           rules
[ruleno
].precsym 
= ruleprec
; 
1785           rules
[ruleno
].prec 
= ruleprec
; 
1787       ritem
[itemno
++] = -ruleno
; 
1796   assert (nritems 
== nitems
); 
1799     ritem_print (stderr
); 
1802 /*-------------------------------------------------------------------. 
1803 | Read in the grammar specification and record it in the format      | 
1804 | described in gram.h.  All guards are copied into the GUARD_OBSTACK | 
1805 | and all actions into ACTION_OBSTACK, in each case forming the body | 
1806 | of a C function (YYGUARD or YYACTION) which contains a switch      | 
1807 | statement to decide which guard or action to execute.              | 
1808 `-------------------------------------------------------------------*/ 
1816   /* Initialize the muscle obstack.  */ 
1817   obstack_init (&muscle_obstack
); 
1819   /* Initialize the symbol table.  */ 
1822   /* Construct the axiom symbol. */ 
1823   axiom 
= getsym ("$axiom"); 
1824   axiom
->class = nterm_sym
; 
1825   axiom
->number 
= nvars
++; 
1827   /* Construct the error token */ 
1828   errtoken 
= getsym ("error"); 
1829   errtoken
->class = token_sym
; 
1830   errtoken
->number 
= ntokens
++; 
1831   errtoken
->user_token_number 
= 256;    /* Value specified by POSIX.  */ 
1833   /* Construct a token that represents all undefined literal tokens. 
1834      It is always token number 2.  */ 
1835   undeftoken 
= getsym ("$undefined."); 
1836   undeftoken
->class = token_sym
; 
1837   undeftoken
->number 
= ntokens
++; 
1838   undeftoken
->user_token_number 
= 2; 
1840   /* Initialize the obstacks. */ 
1841   obstack_init (&action_obstack
); 
1842   obstack_init (&attrs_obstack
); 
1843   obstack_init (&output_obstack
); 
1845   finput 
= xfopen (infile
, "r"); 
1847   /* Read the declaration section.  Copy %{ ... %} groups to 
1848      TABLE_OBSTACK and FDEFINES file.  Also notice any %token, %left, 
1849      etc. found there.  */ 
1850   read_declarations (); 
1852   /* If the user did not define her EOFTOKEN, do it now. */ 
1855       eoftoken 
= getsym ("$"); 
1856       eoftoken
->class = token_sym
; 
1857       eoftoken
->number 
= 0; 
1858       /* Value specified by POSIX.  */ 
1859       eoftoken
->user_token_number 
= 0; 
1862   /* Read in the grammar, build grammar in list form.  Write out 
1863      guards and actions.  */ 
1865   /* Some C code is given at the end of the grammar file. */ 
1866   read_additionnal_code (); 
1871   /* Assign the symbols their symbol numbers.  Write #defines for the 
1872      token symbols into FDEFINES if requested.  */ 
1875   /* Convert the grammar into the format described in gram.h.  */ 
1878   /* The grammar as a symbol_list is no longer needed. */ 
1879   LIST_FREE (symbol_list
, grammar
); 
1887   /* Free the symbol table data structure.  */