Commit | Line | Data |
---|---|---|
54f672b5 C |
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 |