Run time YACC problem
Ram Naresh Singh
singh at tove.cs.umd.edu
Fri Mar 15 03:35:54 AEST 1991
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 at 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;}
;
%%
More information about the Comp.lang.c
mailing list