⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xebec.bnf

📁 早期freebsd实现
💻 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 + -