|
|
1.1 root 1: {
2: #include "main.h"
3: #include "sets.h"
4: #include <stdio.h>
5:
6: extern FILE *eventfile_h, *actfile;
7: }
8:
9: *fmq
10:
11: novocab
12: nobnf
13: nofirst
14: nofollow
15: noparsetable
16: noerrortables
17: nos
18: noe
19:
20: *terminals
21:
22: ID 0 0 { char *address; }
23: STRUCT 0 0
24: SYNONYM 0 0
25: PREDICATE 0 0 { char *address; }
26: ACTION 0 0 { char *address; }
27: /*
28: FSTRING 0 0 { char *address; }
29: */
30: PROTOCOL 0 0
31: LBRACK 0 0
32: RBRACK 0 0
33: LANGLE 0 0
34: EQUAL 0 0
35: COMMA 0 0
36: STAR 0 0
37: EVENTS 0 0
38: TRANSITIONS 0 0
39: INCLUDE 0 0
40: STATES 0 0
41: SEMI 0 0
42: PCB 0 0 { char *address; }
43: DEFAULT 0 0
44: NULLACTION 0 0
45: SAME 0 0
46:
47: *nonterminals
48:
49: pcb { char *address; int isevent; }
50: syn { int type; }
51: setlist { struct Object *setnum; }
52: setlisttail { struct Object *setnum; }
53: part { unsigned char type; }
54: parttail { unsigned char type; }
55: partrest { unsigned char type; char *address; }
56: setstruct { struct Object *object; }
57: setdef { unsigned char type,keep; char *address; struct Object *object; }
58: translist
59: transition
60: event { struct Object *object; }
61: oldstate { struct Object *object; }
62: newstate { struct Object *object; }
63: predicatepart { char *string; }
64: actionpart { char *string; struct Object *oldstate; struct Object *newstate; }
65:
66: *productions
67:
68: program ::=
69: STAR PROTOCOL ID
70: {
71: if(strlen($ID.address) > 50 ) {
72: fprintf(stderr,
73: "Protocol name may not exceed 50 chars in length.\n");
74: Exit(-1);
75: }
76: strcpy(protocol, $ID.address);
77: openfiles(protocol);
78: }
79: STAR includelist
80: PCB
81: {
82: $$pcb.isevent = 0;
83: }
84: pcb
85: {
86: fprintf(actfile, "\ntypedef %s %s%s;\n",
87: $pcb[7].address,protocol, PCBNAME);
88: $$syn.type = PCB_SYN;
89: }
90: syn
91: STAR STATES { $$part.type = (unsigned char) STATESET; } part
92: STAR { end_states(eventfile_h); } EVENTS
93: { $$pcb.isevent = 1; }
94: pcb
95: {
96: fprintf(eventfile_h, "\t"); /* fmq gags on single chars */
97: includecode(eventfile_h, $pcb[14].address);
98: fprintf(eventfile_h, "\n"); /* fmq gags on single chars */
99: $$syn.type = EVENT_SYN;
100: }
101: syn
102: {
103: $$part.type = (unsigned char)EVENTSET;
104: }
105: part
106: STAR { end_events(); }
107: TRANSITIONS
108: {
109: putincludes();
110: putdriver(actfile, 9);
111: }
112: translist
113: ;
114: pcb ::= STRUCT
115: { if($pcb.isevent) {
116: fprintf(stderr,
117: "Event is a list of objects enclosed by \"{}\"\n");
118: Exit(-1);
119: }
120: fprintf(eventfile_h, "struct ");
121: }
122: ACTION { $pcb.address = $ACTION.address; }
123: optsemi
124: ::= ACTION
125: { if( ! $pcb.isevent) {
126: fprintf(stderr,
127: "Pcb requires a type or structure definition.\"{}\"\n");
128: Exit(-1);
129: }
130: $pcb.address = $ACTION.address;
131: }
132: optsemi
133: ::= ID { $pcb.address = $ID.address; } optsemi
134: ;
135:
136: syn ::= SYNONYM ID { synonyms[$syn.type] = stash( $ID.address ); }
137: ::=
138: ;
139:
140: optsemi ::= SEMI
141: ::=
142: ;
143: includelist ::= INCLUDE ACTION { includecode(actfile, $ACTION.address);} STAR
144: ::=
145: ;
146: part ::= ID
147: {
148: $$partrest.address = $ID.address;
149: $$partrest.type = $part.type;
150: }
151: partrest
152: { $$parttail.type = $part.type; }
153: parttail
154: ;
155: parttail ::= { $$part.type = $parttail.type; } part
156: ::=
157: ;
158: partrest ::= EQUAL
159: {
160: if( lookup( $partrest.type, $partrest.address ) ) {
161: fprintf(stderr, "bnf:trying to redefine obj type 0x%x, adr %s\n",
162: $partrest.type, $partrest.address);
163: Exit(-1);
164: }
165: $$setdef.type = $partrest.type;
166: $$setdef.address = stash( $partrest.address );
167: $$setdef.keep = 1;
168: } setdef { $$setstruct.object = $setdef.object; } setstruct
169:
170: ::= ACTION
171: {
172: defineitem($partrest.type,
173: $partrest.address, $ACTION.address);
174: }
175:
176: ::= {
177: defineitem($partrest.type, $partrest.address, (char *)0);
178: }
179: ;
180:
181: setstruct ::= ACTION
182: {
183: if($setstruct.object) {
184: /* WHEN COULD THIS BE FALSE??
185: * isn't it supposed to be setstruct.object???
186: * (it used to be $ACTION.address)
187: */
188:
189: $setstruct.object->obj_struc = $ACTION.address;
190: fprintf(eventfile_h,
191: "struct %s %s%s;\n\n", $ACTION.address,
192: EV_PREFIX, $setstruct.object->obj_name);
193: }
194: }
195: ::=
196: ;
197:
198: setdef ::= LBRACK
199: {
200: $$setlist.setnum =
201: defineset($setdef.type, $setdef.address, $setdef.keep);
202: } setlist RBRACK { $setdef.object = $setlist.setnum; }
203: ;
204:
205: setlist ::= ID
206: {
207: member($setlist.setnum, $ID.address);
208: $$setlisttail.setnum = $setlist.setnum;
209: } setlisttail
210: ;
211:
212: setlisttail ::= COMMA { $$setlist.setnum = $setlisttail.setnum; } setlist
213: ::=
214: ;
215: translist ::= transition translisttail
216: ;
217: translisttail ::= translist
218: ::=
219: ;
220: transition ::= newstate { transno ++; } LANGLE EQUAL EQUAL oldstate
221: event
222: {
223: CurrentEvent /* GAG! */ = $event.object;
224: }
225: predicatepart
226: {
227: $$actionpart.string = $predicatepart.string;
228: $$actionpart.newstate = $newstate.object;
229: $$actionpart.oldstate = $oldstate.object;
230: }
231: actionpart
232: SEMI
233: ;
234:
235: predicatepart ::= PREDICATE
236: {
237: $predicatepart.string = stash ( $PREDICATE.address );
238: }
239: ::= DEFAULT
240: {
241: $predicatepart.string = (char *)0;
242: }
243: ;
244:
245: actionpart ::=
246: ACTION
247: {
248: statetable( $actionpart.string, $actionpart.oldstate,
249: $actionpart.newstate,
250: acttable(actfile, $ACTION.address ),
251: CurrentEvent );
252: if( print_trans ) {
253: dump_trans( $actionpart.string, $actionpart.oldstate,
254: $actionpart.newstate,
255: $ACTION.address, CurrentEvent );
256: }
257: }
258: ::= NULLACTION
259: {
260: statetable($actionpart.string, $actionpart.oldstate, $actionpart.newstate,
261: 0, CurrentEvent ); /* KLUDGE - remove this */
262: if( print_trans ) {
263: dump_trans( $actionpart.string, $actionpart.oldstate,
264: $actionpart.newstate,
265: "NULLACTION", CurrentEvent );
266: }
267: }
268: ;
269:
270: oldstate ::= ID
271: {
272: $oldstate.object = Lookup(STATESET, $ID.address);
273: }
274: ::= {
275: $$setdef.address = (char *)0;
276: $$setdef.type = (unsigned char)STATESET;
277: $$setdef.keep = 0;
278: }
279: setdef
280: {
281: $oldstate.object = $setdef.object;
282: }
283: ;
284:
285: newstate ::= ID
286: {
287: $newstate.object = Lookup(STATESET, $ID.address);
288: }
289: ;
290:
291: newstate ::= SAME
292: {
293: extern struct Object *SameState;
294:
295: $newstate.object = SameState;
296: }
297: ;
298:
299: event ::= ID
300: {
301: $event.object = Lookup(EVENTSET, $ID.address);
302: }
303: ::=
304: {
305: $$setdef.address = (char *)0;
306: $$setdef.type = (unsigned char)EVENTSET;
307: $$setdef.keep = 0;
308: }
309: setdef
310: {
311: $event.object = $setdef.object;
312: }
313: ;
314:
315: *end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.