diff options
Diffstat (limited to 'sys/netiso/xebec/xebec.bnf')
-rw-r--r-- | sys/netiso/xebec/xebec.bnf | 315 |
1 files changed, 315 insertions, 0 deletions
diff --git a/sys/netiso/xebec/xebec.bnf b/sys/netiso/xebec/xebec.bnf new file mode 100644 index 0000000..d7406d9 --- /dev/null +++ b/sys/netiso/xebec/xebec.bnf @@ -0,0 +1,315 @@ +{ +#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 |