extern FILE *eventfile_h, *actfile;
ID 0 0 { char *address; }
PREDICATE 0 0 { char *address; }
ACTION 0 0 { char *address; }
FSTRING 0 0 { char *address; }
PCB 0 0 { char *address; }
pcb { char *address; int isevent; }
setlist { struct Object *setnum; }
setlisttail { struct Object *setnum; }
part { unsigned char type; }
parttail { unsigned char type; }
partrest { unsigned char type; char *address; }
setstruct { struct Object *object; }
setdef { unsigned char type,keep; char *address; struct Object *object; }
event { struct Object *object; }
oldstate { struct Object *object; }
newstate { struct Object *object; }
predicatepart { char *string; }
actionpart { char *string; struct Object *oldstate; struct Object *newstate; }
if(strlen($ID.address) > 50 ) {
"Protocol name may not exceed 50 chars in length.\n");
strcpy(protocol, $ID.address);
fprintf(actfile, "\ntypedef %s %s%s;\n",
$pcb[7].address,protocol, PCBNAME);
STAR STATES { $$part.type = (unsigned char) STATESET; } part
STAR { end_states(eventfile_h); } EVENTS
fprintf(eventfile_h, "\t"); /* fmq gags on single chars */
includecode(eventfile_h, $pcb[14].address);
fprintf(eventfile_h, "\n"); /* fmq gags on single chars */
$$part.type = (unsigned char)EVENTSET;
"Event is a list of objects enclosed by \"{}\"\n");
fprintf(eventfile_h, "struct ");
ACTION { $pcb.address = $ACTION.address; }
"Pcb requires a type or structure definition.\"{}\"\n");
$pcb.address = $ACTION.address;
::= ID { $pcb.address = $ID.address; } optsemi
syn ::= SYNONYM ID { synonyms[$syn.type] = stash( $ID.address ); }
includelist ::= INCLUDE ACTION { includecode(actfile, $ACTION.address);} STAR
$$partrest.address = $ID.address;
$$partrest.type = $part.type;
{ $$parttail.type = $part.type; }
parttail ::= { $$part.type = $parttail.type; } part
if( lookup( $partrest.type, $partrest.address ) ) {
fprintf(stderr, "bnf:trying to redefine obj type 0x%x, adr %s\n",
$partrest.type, $partrest.address);
$$setdef.type = $partrest.type;
$$setdef.address = stash( $partrest.address );
} setdef { $$setstruct.object = $setdef.object; } setstruct
defineitem($partrest.type,
$partrest.address, $ACTION.address);
defineitem($partrest.type, $partrest.address, (char *)0);
/* WHEN COULD THIS BE FALSE??
* isn't it supposed to be setstruct.object???
* (it used to be $ACTION.address)
$setstruct.object->obj_struc = $ACTION.address;
"struct %s %s%s;\n\n", $ACTION.address,
EV_PREFIX, $setstruct.object->obj_name);
defineset($setdef.type, $setdef.address, $setdef.keep);
} setlist RBRACK { $setdef.object = $setlist.setnum; }
member($setlist.setnum, $ID.address);
$$setlisttail.setnum = $setlist.setnum;
setlisttail ::= COMMA { $$setlist.setnum = $setlisttail.setnum; } setlist
translist ::= transition translisttail
translisttail ::= translist
transition ::= newstate { transno ++; } LANGLE EQUAL EQUAL oldstate
CurrentEvent /* GAG! */ = $event.object;
$$actionpart.string = $predicatepart.string;
$$actionpart.newstate = $newstate.object;
$$actionpart.oldstate = $oldstate.object;
predicatepart ::= PREDICATE
$predicatepart.string = stash ( $PREDICATE.address );
$predicatepart.string = (char *)0;
statetable( $actionpart.string, $actionpart.oldstate,
acttable(actfile, $ACTION.address ),
dump_trans( $actionpart.string, $actionpart.oldstate,
$ACTION.address, CurrentEvent );
statetable($actionpart.string, $actionpart.oldstate, $actionpart.newstate,
0, CurrentEvent ); /* KLUDGE - remove this */
dump_trans( $actionpart.string, $actionpart.oldstate,
"NULLACTION", CurrentEvent );
$oldstate.object = Lookup(STATESET, $ID.address);
$$setdef.address = (char *)0;
$$setdef.type = (unsigned char)STATESET;
$oldstate.object = $setdef.object;
$newstate.object = Lookup(STATESET, $ID.address);
extern struct Object *SameState;
$newstate.object = SameState;
$event.object = Lookup(EVENTSET, $ID.address);
$$setdef.address = (char *)0;
$$setdef.type = (unsigned char)EVENTSET;
$event.object = $setdef.object;