🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by Steve Murphy Thu, 06 Aug 1992 16:30
crashes in bison generated grammars: rearrangement fixes, but....
#206
Author: Steve Murphy
Date: Thu, 06 Aug 1992 16:30
138 lines
7075 bytes
This is to  let you  know that all  is  not perfectly well with  bison
generated grammars. I'm  using 1.18,   on a  sparcstation  2,  running
4.1.1.

I have a grammar that looks something like this:

%{
#ifndef LINT
static char rcs_edifmapb_id[] = "$Id: edif_map.b,v 1.10 1992/05/15 20:56:37 murf Exp $";
#endif
#include <stdio.h>
#include "structure.h"
#include "edif_rp_struct.h"
#if defined(EDI) || defined(BERK)

#include "form_edif_interface.h"

#endif
char *re_comp();
struct map *reading,*writing,**current;
#define Calloc(x)  (x *)calloc(sizeof (x),1)
extern double edif_grid_divisor;
extern int page_spacing;
struct path *pptr;
extern struct namefilter *netfilt, *instfilt;
%}

%union {
	struct map *mapstructptr;
	struct position pos;
	struct placement place;
	char string[100];
	double dval;
	int orientation;
	struct pathlist *plist;
	struct path *pathptr;
	struct userwindow userwindow;
       }

%token ON READING WRITING MAP CELL TO SYMBOL MODULE PARAM FORGET SET COMMA SEMI HAS VIA BUNVIA GRIDRES R0 R90 R180 R270 MX MY MYR90 MXR90 OFFSET
%token BUNINPIN BUNOUTPIN BUNIOPIN INPIN OUTPIN IOPIN PICBUNINPIN PICBUNOUTPIN PICBUNIOPIN PICINPIN PICOUTPIN PICIOPIN WIRE FROM DIRMAG WINDOW
%token DIRLESSPINS PAGESPACING EXTRACT EXTRACTNUMBER NET SCHEM FILTER NETNAMES INSTNAMES XSCALE YSCALE
%token <string> STRING
%token <dval> NUM
%type <pos> offset
%type <place> xform
%type <orientation> orient
%type <mapstructptr> readmaplist writemaplist readmapitem writemapitem readmapintro 
         writemapintro paramlist paramobject object paramitem value
%type <pathptr> path
%type <plist> pathlist
%type <userwindow> window
%%

file : statlist {}
     ;

statlist : statitem {}
		| statlist statitem {}
        ;

statitem : reading {}
         | writing {}
         ;

reading: ON READING COMMA {/*current = &reading;*/} readmaplist {} 
       ;

readmaplist : readmapitem {reading=$1;}     /* Will crash here ---v   */
            | readmaplist readmapitem {struct map *x; x=$2; if( $2) {$2->next = $1; reading = $2;
                                         $$ = $2;} else $$ = $1;} 
            ;

readmapitem : readmapintro SEMI {$$ = $1;}
            | paramlist SEMI {$$ = $1;}
			| readmapintro pathlist xform SEMI { $$=$1; $$->place = $3; $$->pathlist = $2; }
			| readmapintro xform pathlist SEMI { $$=$1; $$->place = $2; $$->pathlist = $3; }
			| readmapintro pathlist xform COMMA window SEMI { $$=$1; $$->place = $3; $$->pathlist = $2; $$->win = $5; }
            | readmapintro pathlist xform COMMA paramlist SEMI {$$=$1; $$->parammaplist = $5; $$->pathlist = $2; $$->place = $3; } 
            | readmapintro pathlist xform COMMA window COMMA paramlist SEMI {$$=$1; $$->parammaplist = $7; $$->pathlist = $2; $$->place = $3; $$->win = $5; } 
            | readmapintro xform pathlist COMMA window COMMA paramlist SEMI {$$=$1; $$->parammaplist = $7; $$->pathlist = $3; $$->place = $2; $$->win = $5; } 
            | readmapintro xform pathlist COMMA paramlist SEMI {$$=$1; $$->parammaplist = $5; $$->pathlist = $3; $$->place = $2; } 
			| readmapintro xform pathlist COMMA window SEMI { $$=$1; $$->place = $2; $$->pathlist = $3; $$->win = $5;}
            | readmapintro pathlist COMMA window COMMA paramlist SEMI {$$=$1; $$->parammaplist = $6; $$->pathlist  = $2; $$->win = $4; } 
            | readmapintro pathlist COMMA paramlist SEMI {$$=$1; $$->parammaplist = $4; $$->pathlist  = $2; } 
            | readmapintro xform COMMA window COMMA paramlist SEMI {$$=$1; $$->parammaplist = $6; $$->place = $2; $$->win = $4; } 
            | readmapintro xform COMMA paramlist SEMI {$$=$1; $$->parammaplist = $4; $$->place = $2; } 
            | readmapintro xform SEMI {$$=$1; $$->place = $2; } 
            | readmapintro pathlist SEMI {$$=$1; $$->pathlist  = $2; } 
            | readmapintro paramlist SEMI {$$=$1; $$->parammaplist = $2;} 
			| readmapintro window SEMI {$$=$1; $$->win = $2; }
            | readmapintro window COMMA paramlist SEMI {$$=$1; $$->parammaplist = $4; $$->win = $2;} 
			| MAP paramobject paramlist SEMI {$$ = $2; $$->parammaplist = $3;}
			| SET GRIDRES TO NUM SEMI {edif_grid_divisor = $4; $$=0; 
                edif_print(1,"<<edif_grid_divisor = %f>>\n",edif_grid_divisor);} 
			| SET DIRLESSPINS  SEMI { setDirlessPins(1); $$=0; }
            | SET XSCALE TO NUM SEMI {set_x_scale_factor($4); $$=0;}
            | SET YSCALE TO NUM SEMI {set_y_scale_factor($4); $$=0;}
			| SET PAGESPACING TO NUM SEMI {page_spacing = $4; $$=0;
                edif_print(1,"<<page_spacing = %d>>\n",page_spacing);} 
			| FILTER NETNAMES STRING TO STRING SEMI 
				{struct namefilter *x,*y; x = (struct namefilter *)calloc(sizeof(struct namefilter),1);
					$$=0;strcpy(x->from,$3); strcpy(x->to,$5);
					if( !netfilt ) netfilt =x;
					else{ y=netfilt; while( y->next) y = y->next; y->next = x; }}
			| FILTER INSTNAMES STRING TO STRING SEMI 
				{struct namefilter *x,*y; x = (struct namefilter *)calloc(sizeof(struct namefilter),1);
					$$=0;strcpy(x->from,$3); strcpy(x->to,$5);
					if( !instfilt ) instfilt =x;
					else{ y=instfilt; while( y->next) y = y->next; y->next = x; }}
            ;


anyway, if I move the actions in before  the SEMI, especially the ones
that zero out $$, I will often get crashes when  I try to evaluate the
second rule of  readmaplist. $2 is garbage,  and results in  a segment
fault. We've been fixing this by moving around where  the actions are,
for instance, last time I compiled (probably under 1.16),  this seemed
to make things work better:

			| readmapintro window SEMI {$$=$1; $$->win = $2; }
            | readmapintro window COMMA paramlist SEMI {$$=$1; $$->parammaplist = $4; $$->win = $2;} 
			| MAP paramobject paramlist SEMI {$$ = $2; $$->parammaplist = $3;}
			| SET GRIDRES TO NUM {edif_grid_divisor = $4; $$=0; 
                edif_print(1,"<<edif_grid_divisor = %f>>\n",edif_grid_divisor);} SEMI 
			| SET DIRLESSPINS  { setDirlessPins(1); $$=0; } SEMI
            | SET XSCALE TO NUM {set_x_scale_factor($4); $$=0;} SEMI 
            | SET YSCALE TO NUM {set_y_scale_factor($4); $$=0;} SEMI
			| SET PAGESPACING TO NUM {page_spacing = $4; $$=0;
                edif_print(1,"<<page_spacing = %d>>\n",page_spacing);} SEMI 
			| FILTER NETNAMES STRING TO STRING SEMI 

Now it doesn't. If this kind  of clue doesn't help  you, perhaps I can
rip out some example files and the complete  source to this chunk, and
you can quickly construct a test  executable. The yyvsp stack seems to
be getting mixed up.

murf
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads