[gnu.utils.bug] bison

laplante@IRO.UMONTREAL.CA (Pierre Laplante) (06/09/89)

One of our user got a problem with his bison file.
I got the following output when I run bison with the following file:

-- output --

Script started on Fri Jun  9 09:05:31 1989
laplante has logged on console.
[richelieu:101] bison xxx
xxx contains 23 useless nonterminals and 72 useless rules.
internal error, map_goto
IOT trap (core dumped)
[richelieu:102] exit

script done on Fri Jun  9 09:05:40 1989

-- file --
%{                                                      
# include "stdio.h"                                   
# include "ctype.h"                                   
# include "math.h"                                    
/* NOM        : decl_type.h
   --- 

   FONCTION   : Contient des definitions de structures.
   --------

   DEPEND DE  : Rien.
   ---------

   CREATION   : Ete 84.
   --------

   AUTEUR     : Michel Deslauriers (groupe de recherche sur les protocoles,
   ------       de l'Universite de Montreal).

   PROJET     : Developpement d'outils ASN1. 
   ------

*/



struct generated_number { int  first_value,
                               second_value;
                        };

typedef struct noeud_type                   /* Cette structure sert pour les */
               { unsigned nt_classe:2;      /* noeuds qui constituent l'ar-  */
                 unsigned nt_bidon:1;       /* bre des types                 */
                 unsigned nt_primitif:1;
                 unsigned nt_constructor:1;
                 unsigned nt_idnt_genere:1;
                 unsigned outside_type:1; 
                 unsigned nt_implicit:1;
                 unsigned nt_optionnel:1;
                 char     nt_vers_type[41];
                 char     nt_identif[41];
                 char     nt_type[41];
                 char     nt_type_affiche[41];
                 char     *nt_pt_presentation;
                 char     *nt_pt_explication;
                 char     *nt_pt_valeur_defaut;
                 unsigned nt_standard:1;
                 int      nt_code_id;
                 int      test;
                 struct   generated_number  *generated_number;
                 struct   noeud_type        *nt_pt_fils; 
                 struct   noeud_type        *nt_pt_affiche;
                 struct   noeud_type        *nt_pt_frere; 
                 struct   sur_pere          *nt_pt_sur_pere;
                 struct   liste_association *nt_pt_association;
               } NOEUD_TYPE, *PTE_NOEUD_TYPE; 

struct noeud_valeur                    /* Cette structure sert pour les  */
       { unsigned nv_rattache:1;       /* noeuds qui constituent l'arbre */
         unsigned nv_erreur:1;         /* des valeurs                    */
         unsigned nv_marque:1;
         long     nv_longueur;
         long     nv_lng_tot;
         short    ligne;
         short    niveau;
         unsigned nv_en_erreur:1;
         char     *nv_pt_contenu;
         struct   noeud_type   *nv_pt_type;
         struct   noeud_valeur *nv_pt_fils;
         struct   noeud_valeur *nv_pt_frere;
       };

typedef struct liste_association                 /* Sert a empiler une liste */
               { int    la_valeur;               /* d'associations du genre  */
                 char   la_interpretation[41];   /* {haut (1),bas (0)}       */
                 struct liste_association *pt_frere;
               } PILE_ASSOC, *PTE_ASSOC;
                                                        
# undef  YYMAXDEPTH                                     
# define YYMAXDEPTH  99999                              
                                                        
 struct pt_type_stack { struct pt_type_stack *next;     
                        struct noeud_type    *pt_type;  
                        int                  son_done;  
                        struct pt_type_stack *previous; 
                      };                                
 struct pt_type_stack       *pt_type_stack_top;         
                                                        
 struct noeud_valeur        *la_pdu,                    
                            *pt_val,                    
                            *pt_val_1,                  
                            *save_pt,                   
                            *pt_1,                      
                            *pt_2,                      
                            *pt_3;                      
 extern struct noeud_valeur *par_valeur_ptr;            
 struct noeud_type          *pt_type;                   
 static short               compteur,                   
                            option = 1,                 
                            a_first,                    
                            son;                        
 extern short               pushable;                   
                                                        
 extern struct noeud_type   *root_pt_type;              
 extern long                par_1long_chaine;           
 extern char                *par_1chaine_ptr;           
%}                                                      
                                                        
%start T_PDU                                                        
                                                        
%union { char                 text_1[80];               
         char                 *text_2;                  
         int                  integer;                  
         struct noeud_valeur  *pointer;                 
       }                                                
                                                        
%type <pointer> T_Bool
T_OCTETSTRING
T_Bitstring
T_Integer
T_Null
T_Not_Present
T_NumericString
T_PrintableString
T_TeletexString
T_T61String
T_VideotexString
T_VisibleString
T_IA5String
T_GeneralString
T_GraphicString
T_GeneralizedTime
T_UTCTime
T_PDU
T_Type1
%type <text_2>  T_DecString T_OctetString T_DecimalDigit
                T_Boolean T_Octet T_BitStringPlusThOf T_Bit
%type <integer> T_DecNatRepr T_Nat T_NatNumberPlusNeg
%token <text_1>    Null Not_Present            PDU 
Dec String Reverse NatNum Pred thof Succ Length Octet
Bit Bit1 Bit2 Bit3 Bit4 Bit5 Bit6 Bit7 Bit8
and eq ne not or true false xor implies iff 


%%

T_Bitstring : T_BitStringPlusThOf
{ push_pt_type_stack ("Bitstring");
packbit ($1);
valeur (pt_type_stack_top->pt_type,par_1long_chaine,par_1chaine_ptr);
$$ = par_valeur_ptr;
};

T_Integer : T_NatNumberPlusNeg
{ push_pt_type_stack ("Integer");
valeur (pt_type_stack_top->pt_type,1,&$1);
$$ = par_valeur_ptr;
};

T_Null : Null
{ push_pt_type_stack ("NULL");
  noeudval (pt_type_stack_top->pt_type);
  $$ = par_valeur_ptr;
}
;

T_Not_Present : Not_Present { $$ = NULL; }
;

T_NumericString : T_OctetString
{ push_pt_type_stack ("NumericString");
valeur (pt_type_stack_top->pt_type,strlen ($1),$1);
$$ = par_valeur_ptr;
};

T_PrintableString : T_OctetString
{ push_pt_type_stack ("PrintableString");
valeur (pt_type_stack_top->pt_type,strlen ($1),$1);
$$ = par_valeur_ptr;
};

T_TeletexString : T_OctetString
{ push_pt_type_stack ("TeletexString");
valeur (pt_type_stack_top->pt_type,strlen ($1),$1);
$$ = par_valeur_ptr;
};

T_T61String : T_OctetString
{ push_pt_type_stack ("T61String");
valeur (pt_type_stack_top->pt_type,strlen ($1),$1);
$$ = par_valeur_ptr;
};

T_VideotexString : T_OctetString
{ push_pt_type_stack ("VideotexString");
valeur (pt_type_stack_top->pt_type,strlen ($1),$1);
$$ = par_valeur_ptr;
};

T_VisibleString : T_OctetString
{ push_pt_type_stack ("VisibleString");
valeur (pt_type_stack_top->pt_type,strlen ($1),$1);
$$ = par_valeur_ptr;
};

T_IA5String : T_OctetString
{ push_pt_type_stack ("IA5String");
valeur (pt_type_stack_top->pt_type,strlen ($1),$1);
$$ = par_valeur_ptr;
};

T_GeneralString : T_OctetString
{ push_pt_type_stack ("GeneralString");
valeur (pt_type_stack_top->pt_type,strlen ($1),$1);
$$ = par_valeur_ptr;
};

T_GraphicString : T_OctetString
{ push_pt_type_stack ("GraphicString");
valeur (pt_type_stack_top->pt_type,strlen ($1),$1);
$$ = par_valeur_ptr;
};

T_GeneralizedTime : T_OctetString
{ push_pt_type_stack ("GeneralizedTime");
valeur (pt_type_stack_top->pt_type,strlen ($1),$1);
$$ = par_valeur_ptr;
};

T_UTCTime : T_OctetString
{ push_pt_type_stack ("UTCTime");
valeur (pt_type_stack_top->pt_type,strlen ($1),$1);
$$ = par_valeur_ptr;
};

T_PDU : PDU '('  { push_pt_type_stack ("PDU");
}
T_Integer ',' T_Bool ',' T_Type1 ')' 
{ pop_pt_type_stack (3);
  pt_type = pt_type_stack_top->pt_type;
  pt_val  = $4;                                     
  pt_val_1 = pt_val;                                
  son = 0;                                          
  a_first = 0;                                      
  if (!pere_bidon ())                               
     { noeudval (pt_type);                          
       $$ = par_valeur_ptr;                         
       if (node_in_between (pt_type,pt_val))        
          { noeudval (pt_type->nt_pt_fils);         
            par_valeur_ptr->nv_pt_fils = pt_val;    
            $$->nv_pt_fils = par_valeur_ptr;        
          }                                         
       else { $$->nv_pt_fils = pt_val;              
              if (pt_val == NULL)                   
                 { pt_val_1 = par_valeur_ptr;       
                   son = 1;                         
                 }                                  
            }                                       
     }                                              
  else if (node_in_between (pt_type,pt_val))        
          { noeudval (pt_type->nt_pt_fils);         
            par_valeur_ptr->nv_pt_fils = pt_val;    
            $$ = par_valeur_ptr;                    
          }                                         
       else if (pt_val != NULL)                     
               $$ = pt_val;                         
            else { son = 1;                         
                   a_first = 1;                     
                 }                                  
if ($6 != NULL)                                 
   { if (son)                                    
        if (a_first)                             
           { a_first = 0;                        
             son     = 0;                        
      if (node_in_between (pt_type,$6))         
         { noeudval (pt_type->nt_pt_fils);       
           $$ = par_valeur_ptr;                  
           $$->nv_pt_fils = $6;                 
         }                                       
      else $$ = $6;                             
             pt_val_1 = $$;                      
           }                                     
        else { son = 0;                          
         if (pt_val == NULL                      
             &&                                  
             node_in_between (pt_type,$6)       
            )                                    
            { noeudval (pt_type->nt_pt_fils);    
              par_valeur_ptr->nv_pt_fils = $6;  
              $$->nv_pt_fils = par_valeur_ptr;   
              pt_val = par_valeur_ptr;           
              pt_val_1 = $6;                    
            }                                    
         else { pt_val_1->nv_pt_fils = $6;      
                pt_val_1 = pt_val_1->nv_pt_fils; 
              }                                  
             }                                   
          else { pt_val_1->nv_pt_frere = $6;    
                 pt_val_1=pt_val_1->nv_pt_frere; 
               }                                 
     }                                           
if ($8 != NULL)                                 
   { if (son)                                    
        if (a_first)                             
           { a_first = 0;                        
             son     = 0;                        
      if (node_in_between (pt_type,$8))         
         { noeudval (pt_type->nt_pt_fils);       
           $$ = par_valeur_ptr;                  
           $$->nv_pt_fils = $8;                 
         }                                       
      else $$ = $8;                             
             pt_val_1 = $$;                      
           }                                     
        else { son = 0;                          
         if (pt_val == NULL                      
             &&                                  
             node_in_between (pt_type,$8)       
            )                                    
            { noeudval (pt_type->nt_pt_fils);    
              par_valeur_ptr->nv_pt_fils = $8;  
              $$->nv_pt_fils = par_valeur_ptr;   
              pt_val = par_valeur_ptr;           
              pt_val_1 = $8;                    
            }                                    
         else { pt_val_1->nv_pt_fils = $8;      
                pt_val_1 = pt_val_1->nv_pt_fils; 
              }                                  
             }                                   
          else { pt_val_1->nv_pt_frere = $8;    
                 pt_val_1=pt_val_1->nv_pt_frere; 
               }                                 
     }                                           
  la_pdu = $$;
}
;

T_Type1 : { push_pt_type_stack ("Type1");
if ((pt_type_stack_top->pt_type->nt_pt_fils == NULL
     &&
     pt_type_stack_top->pt_type->nt_pt_frere == NULL
    )
    ||
    (pt_type_stack_top->pt_type->nt_bidon
     &&
     terminal_type (pt_type_stack_top->pt_type->nt_pt_fils->nt_type)
    )
   )
   { option = 2;
     pushable = 0;
   }
}
T_Integer
{switch (option)
{ case 1 :
 pop_pt_type_stack (1);                                 
  pt_type = pt_type_stack_top->pt_type;                 
  if (!pere_bidon ())                                   
     { noeudval (pt_type);                              
       $$ = par_valeur_ptr;                             
       if (node_in_between (pt_type,$2))                
          { noeudval (pt_type->nt_pt_fils);             
            par_valeur_ptr->nv_pt_fils = $2;            
            $$->nv_pt_fils = par_valeur_ptr;            
          }                                             
       else $$->nv_pt_fils = $2;                        
     }                                                  
  else if (node_in_between (pt_type,$2))                
          { noeudval (pt_type->nt_pt_fils);             
            par_valeur_ptr->nv_pt_fils = $2;            
            $$ = par_valeur_ptr;                        
          }                                             
       else $$ = $2;                                    
break;

case 2 :
$$ = $2;
option = 1;
break;
}
  };

/* NAME         : yacc.rest 
   ----

   FUNCTION     : - Contains predined Yacc rules for librairy's types 
   --------         such Boolean, NaturalNumber etc ...

                  - Contains an inclusion of the file generated_lex.c
                    which contains the lexical analyser generated from
                    the Lex specification which has been generated by
                    the generator. 

                  - The content of this file is used to complete the
                    Yacc specification that the generator module generates.

   DEPENDS ON   : Nothing. 
   ----------

   CREATION     : November '88 (last revised February '89).
   --------

   AUTHOR       : Michel Deslauriers
   ------         (protocol research group of Universite de Montreal).

   PROJECT      : For Lotos research.
   -------

*/


T_Bool : T_Boolean
         { push_pt_type_stack ("BOOLEAN");
           valeur (pt_type_stack_top->pt_type,1,$1);
           $$ = par_valeur_ptr;
         };

T_Boolean : true
            { F_1 (&$$,"","V"); }
            |
            false
            { F_1 (&$$,"",""); }
            |
            not '(' T_Boolean ')'
            { if ($3[0] == 'V')
                 F_1 (&$$,"","");
              else F_1 (&$$,"","V");
            }
            |
            and '(' T_Boolean ',' T_Boolean ')'
            { if ($3[0] == 'V'
                  &&
                  $5[0] == 'V'
                 )
               F_1 (&$$,"","V");
              else F_1 (&$$,"","");
            }
            |
            or '(' T_Boolean ',' T_Boolean ')' 
            { if ($3[0] != 'V'
                  &&
                  $5[0] != 'V'
                 )
                 F_1 (&$$,"","");
              else F_1 (&$$,"","V");
            }
            |
            xor '(' T_Boolean ',' T_Boolean ')'
            { if ($3[0] != $5[0])
                 F_1 (&$$,"","V");
              else F_1 (&$$,"","");
            }
            |
            implies '(' T_Boolean ',' T_Boolean ')'
            { if ($3[0] == 'V'
                  &&
                  $5[0] != 'V'
                 )
                 F_1 (&$$,"","");
              else F_1 (&$$,"","V");
            }
            |
            iff '(' T_Boolean ',' T_Boolean ')'
            { if ($3[0] != $5[0])
                 F_1 (&$$,"","");
              else F_1 (&$$,"","V");
            }
            |
            eq '(' T_Boolean ',' T_Boolean ')'
            { if ($3[0] != $5[0])
                 F_1 (&$$,"","");
              else F_1 (&$$,"","V");
            }
            |
            ne '(' T_Boolean ',' T_Boolean ')'
            { if ($3[0] != $5[0])
                 F_1 (&$$,"","V");
              else F_1 (&$$,"","");
            };

T_DecNatRepr : T_Nat ;

T_Nat       : '*' '(' T_Nat ',' T_Nat ')'
              { $$ = $3 * $5; }
              |
              '*' '*' '(' T_Nat ',' T_Nat ')'
              { $$ = power ($4,$6); }
              |
              '+' '(' T_Nat ',' T_Nat ')'
              { $$ = $3 + $5; }
              |
              '-' '(' T_Nat ',' T_Nat ')'
              { $$ = $3 - $5; }
              |
              '0'
              { $$ = 0; }
              |
              Length '(' T_DecString ')'
              { $$ = strlen ($3); }
              |
              Succ '(' T_Nat ')'
              { $$ = $3 + 1; }
              |
              NatNum '(' T_DecString ')'
              { $$ = atoi ($3); };

T_NatNumberPlusNeg : '*' '(' T_NatNumberPlusNeg ',' T_NatNumberPlusNeg ')'
                     { $$ = $3 * $5; }
                     |
                     '*' '*' '(' T_NatNumberPlusNeg ',' T_NatNumberPlusNeg ')'
                     { $$ = power ($4,$6); }
                     |
                     '+' '(' T_NatNumberPlusNeg ',' T_NatNumberPlusNeg ')'
                     { $$ = $3 + $5; }
                     |
                     '-' '(' T_NatNumberPlusNeg ',' T_NatNumberPlusNeg ')'
                     { $$ = $3 - $5; }
                     |
                     '0'
                     { $$ = 0; }
                     |
                     Succ '(' T_NatNumberPlusNeg ')'
                     { $$ = $3 + 1; }
                     |
                     Pred '(' T_NatNumberPlusNeg ')' 
                     { $$ = $3 - 1; };

T_DecString : '+' '(' T_DecimalDigit ',' T_DecString ')'
              { F_1 (&$$,$3,$5); }
              |
              '+' '+' '(' T_DecString ',' T_DecString ')'
              { F_1 (&$$,$4,$6); }
              |
              Dec '(' T_DecimalDigit ')'
              { F_1 (&$$,"",$3); }
              |
              Reverse '(' T_DecString ')'
              { F_2 (&$$,$3); };

T_DecimalDigit : '0' { F_1 (&$$,"","0"); } |
                 '1' { F_1 (&$$,"","1"); } |
                 '2' { F_1 (&$$,"","2"); } |
                 '3' { F_1 (&$$,"","3"); } |
                 '4' { F_1 (&$$,"","4"); } |
                 '5' { F_1 (&$$,"","5"); } |
                 '6' { F_1 (&$$,"","6"); } |
                 '7' { F_1 (&$$,"","7"); } |
                 '8' { F_1 (&$$,"","8"); } |
                 '9' { F_1 (&$$,"","9"); } |
                 Succ '(' T_DecimalDigit ')'
                 { F_3 (&$$,$3); };

T_OCTETSTRING : T_OctetString
                { push_pt_type_stack ("OCTETSTRING");
                  valeur (pt_type_stack_top->pt_type,strlen ($1),$1);
                  $$ = par_valeur_ptr;
                };

T_OctetString : '+' '(' T_Octet ',' T_OctetString ')'
                { F_1 (&$$,$3,$5); }
                |
                '+' '+' '(' T_OctetString ',' T_OctetString ')'
                { F_1 (&$$,$4,$6); }
                |
                '<' '>'
                { F_1 (&$$,"",""); }
                |
                Octet '(' T_Octet ')'
                { F_1 (&$$,"",$3); }
                |
                Reverse '(' T_OctetString ')'
                { F_2 (&$$,$3); };

T_Octet : Octet '(' T_Bit ',' T_Bit ',' T_Bit ',' T_Bit ','
                    T_Bit ',' T_Bit ',' T_Bit ',' T_Bit
                ')'
          { F_5 (&$$,$3,$5,$7,$9,$11,$13,$15,$17); };

T_BitStringPlusThOf :'+' '(' T_Bit ',' T_BitStringPlusThOf ')'
                     { F_1 (&$$,$3,$5); }
                     |
                     '+' '+' '(' T_BitStringPlusThOf ',' T_BitStringPlusThOf ')'
                     { F_1 (&$$,$4,$6); }
                     |
                     Bit '(' T_Bit ')'
                     { F_1 (&$$,"",$3); }
                     |
                     Reverse '(' T_BitStringPlusThOf ')'
                     { F_2 (&$$,$3); };

T_Bit : '0' { F_1 (&$$,"","0"); }
        |
        '1' { F_1 (&$$,"","1"); }
        |
        '<' '(' T_Bit ',' T_Bit ')'
        { F_6 (&$$,$3,$5,1); }
        |
        '<' '>' '(' T_Bit ',' T_Bit ')'
        { F_6 (&$$,$4,$6,2); }
        |
        '=' '<' '(' T_Bit ',' T_Bit ')'
        { F_6 (&$$,$4,$6,3); }
        |
        '=' '=' '(' T_Bit ',' T_Bit ')'
        { F_6 (&$$,$4,$6,4); }
        |
        '>' '(' T_Bit ',' T_Bit ')'
        { F_6 (&$$,$3,$5,5); }
        |
        '>' '=' '(' T_Bit ',' T_Bit ')'
        { F_6 (&$$,$4,$6,6); }
        |
        Bit1 '(' T_Octet ')'
        { F_7 (&$$,$3,1); }
        |
        Bit2 '(' T_Octet ')'
        { F_7 (&$$,$3,2); }
        |
        Bit3 '(' T_Octet ')'
        { F_7 (&$$,$3,3); }
        |
        Bit4 '(' T_Octet ')'
        { F_7 (&$$,$3,4); }
        |
        Bit5 '(' T_Octet ')'
        { F_7 (&$$,$3,5); }
        |
        Bit6 '(' T_Octet ')'
        { F_7 (&$$,$3,6); }
        |
        Bit7 '(' T_Octet ')'
        { F_7 (&$$,$3,7); }
        |
        Bit8 '(' T_Octet ')'
        { F_7 (&$$,$3,8); }
        |
        Succ '(' T_Bit ')'
        { F_8 (&$$,$3); }
        |
        and '(' T_Bit ',' T_Bit ')'
        { F_6 (&$$,$3,$5,7); }
        |
        eq '(' T_Bit ',' T_Bit ')'
        { F_6 (&$$,$3,$5,4); }
        |
        ne '(' T_Bit ',' T_Bit ')'
        { F_6 (&$$,$3,$5,2); }
        |
        not '(' T_Bit ')'
        { F_8 (&$$,$3); }
        |
        or '(' T_Bit ',' T_Bit ')'
        { F_6 (&$$,$3,$5,8); }
        |
        thof '(' T_Nat ',' T_BitStringPlusThOf ')'
        { F_9 (&$$,$3,$5); };


%%


# include "generated_lex.c"

-- 

Pierre Laplante	 				
Universite de Montreal, Dep. I.R.O. X-220, C.P. 6128, succursale A
Montreal (Quebec) H3C 3J7, (514) 343-6830, laplante@iro.umontreal.ca