%{ #include #include #include #include "necro.h" int mcnt = 0; struct _gang *root; /* * $Header: /blue/homes/cowell/src/nec/RCS/nec.y,v 1.1 1996/04/20 21:04:54 cowell Exp cowell $ * * nec.y * Copyright Andy Cowell , all rights reserved. * * $Log: nec.y,v $ * Revision 1.1 1996/04/20 21:04:54 cowell * Initial revision * * */ static char *rcsid = "$Id: nec.y,v 1.1 1996/04/20 21:04:54 cowell Exp cowell $"; %} %union { int val; char *str; struct _member *mbr; struct _gang *gng; } %token INTEGER STRING EQ LP RP COMMA NAME RATING TTORY STASH HOARD MEMBER %type STRING nameline ttoryline hoardline %type stritemlist strlist %type INTEGER ratingline stashline %type memberlist memberline %type gang ganglist file %% file : ganglist { root = $1; } ; ganglist : gang { $$ = $1; } | gang ganglist { struct _gang *g; /* for (g=$2; g->next!=((struct _gang *)NULL); g=g->next) ; */ /* g->next = $1; */ /* $$ = $2; */ $1->next = $2; $$ = $1; } ; gang : nameline ratingline ttoryline stashline hoardline memberlist { struct _gang *g; struct _member *m; char *s; g = (struct _gang *)malloc(sizeof(struct _gang)); g->name = $1; g->rating = $2; g->ttory = $3; g->stash = $4; g->hoard = $5; g->member = $6; for (m=g->member; m!=((struct _member *)NULL); m=m->next) m->gang_name = g->name; g->next = ((struct _gang *)NULL); $$ = g; } ; nameline : NAME STRING { $$ = $2; } ; ratingline : RATING INTEGER { $$ = $2; } ; ttoryline : TTORY stritemlist { $$ = $2; } ; stashline : STASH INTEGER { $$ = $2; } ; hoardline : HOARD strlist { $$ = $2; } ; memberlist : memberline { $$ = $1; } | memberlist memberline { struct _member *m; for (m=$1; m->next!=((struct _member *)NULL); m=m->next); m->next = $2; $$ = $1; } ; memberline : MEMBER STRING STRING INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER STRING strlist STRING strlist STRING strlist INTEGER INTEGER { struct _member *m; m = (struct _member *)malloc(sizeof(struct _member)); /* Get the name */ m->name = (char *)malloc(sizeof(char) * strlen($2) + 2); strcpy(m->name, $2); /* Get the pos */ m->pos = (char *)malloc(sizeof(char) * strlen($3) + 2); strcpy(m->pos, $3); /* Get stats */ m->m = $4; m->ws = $5; m->bs = $6; m->s = $7; m->t = $8; m->w = $9; m->i = $10; m->a = $11; m->ld = $12; /* Get the injuries */ if ($14 == ((char *)NULL)) { m->injuries = ((char *)NULL); } else { m->injuries = (char *)malloc(sizeof(char) * strlen($14) + 2); strcpy(m->injuries, $14); } /* Get the equipment */ if ($16 == ((char *)NULL)) { m->equipment = ((char *)NULL); } else { m->equipment = (char *)malloc(sizeof(char) * strlen($16) + 2); strcpy(m->equipment, $16); } /* Get the skills */ if ($18 == ((char *)NULL)) { m->skills = ((char *)NULL); } else { m->skills = (char *)malloc(sizeof(char) * strlen($18) + 2); strcpy(m->skills, $18); } /* Get the cost and the experience. */ m->cost = $19; m->exp = $20; m->next = ((struct _member *)NULL); $$ = m; } ; strlist : EQ LP stritemlist RP { $$ = $3; } | EQ LP RP { $$ = ((char *)NULL); } ; stritemlist : STRING { char *p; p = (char *)malloc(sizeof(char) * strlen($1) + 2); strcpy(p, $1); free($1); $$ = p; } | STRING COMMA stritemlist { char *p; p = (char *)malloc(sizeof(char) * strlen($1) * strlen($3) + 4); strcpy(p, $1); strcat(p, ", "); strcat(p, $3); free($1); free($3); $$ = p; } ; %%