[comp.lang.c] Run time YACC problem

singh@tove.cs.umd.edu (Ram Naresh Singh) (03/15/91)

Hi!

I am having some problem in running a module whose source c files
are combination of yacc generated c files and  devguide generated(a graphic
user interface application building program) c files.
Devguide generated c files work well if I link it with a simple c file. 
I don't get linking error in linking devguide generated c file with a yacc 
generated c file. But the moment I run the program,
at very first c statement in main() I get "Illegal 
Instruction(Core Dump)". This first statement is a library call and thus
I can't look up the source statement in my debuger. Again if I leave out the
yacc module, every thing runs great. Also yacc generated program runs fine
independently. 

I am running this on a SPARCS station 1+ and in OPENWINDOWS under SUNOS 4.1.

Any help would be appreciated to solve the above 
problem.

Thanks in advance.

RAM 
email - singh@cs.umd.edu
Voice - 405-2725
----------------------------------------
YACC File
----------------------------------------

%{
#include	<stdio.h>
#include	<ctype.h>

#define TRUE		1		/* New hash definition */
#define	FALSE		0		/* New hash definition */
#define	NORMAL		1
#define	DEPT_MODE 	2
#define HOGS_MAX	-1
#define HOGS_MIN	-2
#define VALUE_UNKNOWN	-5
#define MAX_NAME_LEN	20
#define MAX_CHILDREN	20
#define	MAX_LEVELS	40		/* New hash definition */
#define	MAX_NODES	1000

typedef struct node
	{
	struct node	*parent_ptr;
	char	      	node_level;
	char		dept_name[MAX_NAME_LEN];
	long		total;
	long		salary;
	long		average;
	long		hogs;
	short		child_index;
	long		cum_sal;	/* New field */
	char		leaf;		/* New field */
	char		next;		/* New field */
	struct node	*level_ptr;	/* New field */
	struct node	*child_ptr[MAX_CHILDREN];
	}node;

node	*root_ptr, *temp_ptr, *curr_ptr;
long	buff_track[MAX_NODES];
node	*level_ptr[MAX_LEVELS];			/* New variable */
int	loop_var, buff_count = 0;
int	level_index = 0;                        /* New variable */

char	terminator = '$';
char	dept_name[20][20];
int	same_level = 0;
int	node_flag = 0;
int	disp_flag = 0;
int	mode = NORMAL;
int	index = 0;
%}

%start list
%token DIGIT LOWER UPPER ALPHA

%%

list :
	| list stat '#'
	{
         your_function();
         node_flag = 0;
         disp_flag = 0;
	 level_index = 0;   /* New statement */
	 printf("\nTotal nodes = %d", buff_count);
	 for (loop_var = 0; loop_var < buff_count; loop_var++)
	     free((char *)buff_track[loop_var]);
	 buff_count = 0;
        }
	| list error 
		{exit(1);}
	;
stat : '(' decl expr ')'
	| '$'
		{printf("\nParsing is thru'");exit(1);}
	;

decl : '(' decl_sal  decl_avg  decl_hog ')'
	;

decl_sal : '(' key_sal type_sal ')'
	;

decl_avg : '(' key_avg type_avg ')'
	;

decl_hog : '(' key_hog type_hog ')'
	;

key_sal : 's' 'a' 'l' 'a' 'r' 'y'
	;

type_sal : 'i' 'n' 't' 'e' 'g' 'e' 'r'
	| 'l' 'o' 'n' 'g'
	;
 
key_avg  : 'a' 'v' 'e' 'r' 'a' 'g' 'e' '_' 's' 'a' 'l' 'a' 'r' 'y'
	;

type_avg : 'i' 'n' 't' 'e' 'g' 'e' 'r'
	| 'l' 'o' 'n' 'g'
	;
 
key_hog : 'h' 'o' 'g' 's'
	;

type_hog : 'i' 'n' 't' 'e' 'g' 'e' 'r'
	| 'l' 'o' 'n' 'g'
	;
 
expr :  '(' '"' dept '"' tot '['  sal sum ']' '[' avg average ']' '[' hog max ']'  ')' 
	| '(' '"' dept '"' tot '['  sal sum ']' '[' avg average ']' '[' hog max ']' expr  ')' 
	| expr expr
	;




dept : ALPHA
	| dept ALPHA;

tot : 's' 'u' 'm'
	    {curr_ptr->total = VALUE_UNKNOWN;}
	| number
	    {curr_ptr->total = $1;}
	;

sum : 's' 'u' 'm'
	    {curr_ptr->salary = VALUE_UNKNOWN;}
	| number
	    {curr_ptr->salary  = $1;
	     curr_ptr->cum_sal = $1;}
	;

sal : 's' 'a' 'l' 'a' 'r' 'y';

avg : 'a' 'v' 'e' 'r' 'a' 'g' 'e' '_' 's' 'a' 'l' 'a' 'r' 'y';

average : 'a' 'v' 'e' 'r' 'a' 'g' 'e'
	    {curr_ptr->average = VALUE_UNKNOWN;}
	| number
	    {curr_ptr->average = $1;}
	;

hog : 'h' 'o' 'g' 's';

max : 'm' 'a' 'x'
	    {curr_ptr->hogs = HOGS_MAX;}
	| 'm' 'i' 'n'
	    {curr_ptr->hogs = HOGS_MIN;}
	| number
	    {curr_ptr->hogs = $1;}
	;

number :  DIGIT
		{$$ = $1;}
	| number DIGIT
		{$$ = 10 * $1 + $2;}
	;


%%