home *** CD-ROM | disk | FTP | other *** search
- {
- #include "main.h"
- #include "sets.h"
- #include <stdio.h>
-
- extern FILE *eventfile_h, *actfile;
- }
-
- *fmq
-
- novocab
- nobnf
- nofirst
- nofollow
- noparsetable
- noerrortables
- nos
- noe
-
- *terminals
-
- ID 0 0 { char *address; }
- STRUCT 0 0
- SYNONYM 0 0
- PREDICATE 0 0 { char *address; }
- ACTION 0 0 { char *address; }
- /*
- FSTRING 0 0 { char *address; }
- */
- PROTOCOL 0 0
- LBRACK 0 0
- RBRACK 0 0
- LANGLE 0 0
- EQUAL 0 0
- COMMA 0 0
- STAR 0 0
- EVENTS 0 0
- TRANSITIONS 0 0
- INCLUDE 0 0
- STATES 0 0
- SEMI 0 0
- PCB 0 0 { char *address; }
- DEFAULT 0 0
- NULLACTION 0 0
- SAME 0 0
-
- *nonterminals
-
- pcb { char *address; int isevent; }
- syn { int type; }
- 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; }
- translist
- transition
- event { struct Object *object; }
- oldstate { struct Object *object; }
- newstate { struct Object *object; }
- predicatepart { char *string; }
- actionpart { char *string; struct Object *oldstate; struct Object *newstate; }
-
- *productions
-
- program ::=
- STAR PROTOCOL ID
- {
- if(strlen($ID.address) > 50 ) {
- fprintf(stderr,
- "Protocol name may not exceed 50 chars in length.\n");
- Exit(-1);
- }
- strcpy(protocol, $ID.address);
- openfiles(protocol);
- }
- STAR includelist
- PCB
- {
- $$pcb.isevent = 0;
- }
- pcb
- {
- fprintf(actfile, "\ntypedef %s %s%s;\n",
- $pcb[7].address,protocol, PCBNAME);
- $$syn.type = PCB_SYN;
- }
- syn
- STAR STATES { $$part.type = (unsigned char) STATESET; } part
- STAR { end_states(eventfile_h); } EVENTS
- { $$pcb.isevent = 1; }
- pcb
- {
- fprintf(eventfile_h, "\t"); /* fmq gags on single chars */
- includecode(eventfile_h, $pcb[14].address);
- fprintf(eventfile_h, "\n"); /* fmq gags on single chars */
- $$syn.type = EVENT_SYN;
- }
- syn
- {
- $$part.type = (unsigned char)EVENTSET;
- }
- part
- STAR { end_events(); }
- TRANSITIONS
- {
- putincludes();
- putdriver(actfile, 9);
- }
- translist
- ;
- pcb ::= STRUCT
- { if($pcb.isevent) {
- fprintf(stderr,
- "Event is a list of objects enclosed by \"{}\"\n");
- Exit(-1);
- }
- fprintf(eventfile_h, "struct ");
- }
- ACTION { $pcb.address = $ACTION.address; }
- optsemi
- ::= ACTION
- { if( ! $pcb.isevent) {
- fprintf(stderr,
- "Pcb requires a type or structure definition.\"{}\"\n");
- Exit(-1);
- }
- $pcb.address = $ACTION.address;
- }
- optsemi
- ::= ID { $pcb.address = $ID.address; } optsemi
- ;
-
- syn ::= SYNONYM ID { synonyms[$syn.type] = stash( $ID.address ); }
- ::=
- ;
-
- optsemi ::= SEMI
- ::=
- ;
- includelist ::= INCLUDE ACTION { includecode(actfile, $ACTION.address);} STAR
- ::=
- ;
- part ::= ID
- {
- $$partrest.address = $ID.address;
- $$partrest.type = $part.type;
- }
- partrest
- { $$parttail.type = $part.type; }
- parttail
- ;
- parttail ::= { $$part.type = $parttail.type; } part
- ::=
- ;
- partrest ::= EQUAL
- {
- if( lookup( $partrest.type, $partrest.address ) ) {
- fprintf(stderr, "bnf:trying to redefine obj type 0x%x, adr %s\n",
- $partrest.type, $partrest.address);
- Exit(-1);
- }
- $$setdef.type = $partrest.type;
- $$setdef.address = stash( $partrest.address );
- $$setdef.keep = 1;
- } setdef { $$setstruct.object = $setdef.object; } setstruct
-
- ::= ACTION
- {
- defineitem($partrest.type,
- $partrest.address, $ACTION.address);
- }
-
- ::= {
- defineitem($partrest.type, $partrest.address, (char *)0);
- }
- ;
-
- setstruct ::= ACTION
- {
- if($setstruct.object) {
- /* 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;
- fprintf(eventfile_h,
- "struct %s %s%s;\n\n", $ACTION.address,
- EV_PREFIX, $setstruct.object->obj_name);
- }
- }
- ::=
- ;
-
- setdef ::= LBRACK
- {
- $$setlist.setnum =
- defineset($setdef.type, $setdef.address, $setdef.keep);
- } setlist RBRACK { $setdef.object = $setlist.setnum; }
- ;
-
- setlist ::= ID
- {
- member($setlist.setnum, $ID.address);
- $$setlisttail.setnum = $setlist.setnum;
- } setlisttail
- ;
-
- setlisttail ::= COMMA { $$setlist.setnum = $setlisttail.setnum; } setlist
- ::=
- ;
- translist ::= transition translisttail
- ;
- translisttail ::= translist
- ::=
- ;
- transition ::= newstate { transno ++; } LANGLE EQUAL EQUAL oldstate
- event
- {
- CurrentEvent /* GAG! */ = $event.object;
- }
- predicatepart
- {
- $$actionpart.string = $predicatepart.string;
- $$actionpart.newstate = $newstate.object;
- $$actionpart.oldstate = $oldstate.object;
- }
- actionpart
- SEMI
- ;
-
- predicatepart ::= PREDICATE
- {
- $predicatepart.string = stash ( $PREDICATE.address );
- }
- ::= DEFAULT
- {
- $predicatepart.string = (char *)0;
- }
- ;
-
- actionpart ::=
- ACTION
- {
- statetable( $actionpart.string, $actionpart.oldstate,
- $actionpart.newstate,
- acttable(actfile, $ACTION.address ),
- CurrentEvent );
- if( print_trans ) {
- dump_trans( $actionpart.string, $actionpart.oldstate,
- $actionpart.newstate,
- $ACTION.address, CurrentEvent );
- }
- }
- ::= NULLACTION
- {
- statetable($actionpart.string, $actionpart.oldstate, $actionpart.newstate,
- 0, CurrentEvent ); /* KLUDGE - remove this */
- if( print_trans ) {
- dump_trans( $actionpart.string, $actionpart.oldstate,
- $actionpart.newstate,
- "NULLACTION", CurrentEvent );
- }
- }
- ;
-
- oldstate ::= ID
- {
- $oldstate.object = Lookup(STATESET, $ID.address);
- }
- ::= {
- $$setdef.address = (char *)0;
- $$setdef.type = (unsigned char)STATESET;
- $$setdef.keep = 0;
- }
- setdef
- {
- $oldstate.object = $setdef.object;
- }
- ;
-
- newstate ::= ID
- {
- $newstate.object = Lookup(STATESET, $ID.address);
- }
- ;
-
- newstate ::= SAME
- {
- extern struct Object *SameState;
-
- $newstate.object = SameState;
- }
- ;
-
- event ::= ID
- {
- $event.object = Lookup(EVENTSET, $ID.address);
- }
- ::=
- {
- $$setdef.address = (char *)0;
- $$setdef.type = (unsigned char)EVENTSET;
- $$setdef.keep = 0;
- }
- setdef
- {
- $event.object = $setdef.object;
- }
- ;
-
- *end
-