📄 xebec.bnf
字号:
{#include "main.h"#include "sets.h"#include <stdio.h> extern FILE *eventfile_h, *actfile; }*fmq novocab nobnf nofirst nofollow noparsetable noerrortables nos noe*terminalsID 0 0 { char *address; }STRUCT 0 0SYNONYM 0 0PREDICATE 0 0 { char *address; }ACTION 0 0 { char *address; }/*FSTRING 0 0 { char *address; }*/PROTOCOL 0 0 LBRACK 0 0RBRACK 0 0LANGLE 0 0EQUAL 0 0COMMA 0 0STAR 0 0EVENTS 0 0TRANSITIONS 0 0INCLUDE 0 0STATES 0 0SEMI 0 0PCB 0 0 { char *address; }DEFAULT 0 0NULLACTION 0 0SAME 0 0*nonterminalspcb { 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; }*productionsprogram ::= 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -