1 #ifndef lint
2 static char yysccsid[] = "@(#)yaccpar 1.8 (Berkeley) 01/20/90";
3 #endif
4 #define YYBYACC 1
5 #line 2 "tcpgram.y"
6 /*
7 * Copyright (c) 1988-1990 The Regents of the University of California.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that: (1) source code distributions
12 * retain the above copyright notice and this paragraph in its entirety, (2)
13 * distributions including binary code include the above copyright notice and
14 * this paragraph in its entirety in the documentation or other materials
15 * provided with the distribution, and (3) all advertising materials mentioning
16 * features or use of this software display the following acknowledgement:
17 * ``This product includes software developed by the University of California,
18 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
19 * the University nor the names of its contributors may be used to endorse
20 * or promote products derived from this software without specific prior
21 * written permission.
22 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
23 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
24 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
25 *
26 * Grammar for tcpdump.
27 */
28 #ifndef lint
29 static char rcsid[] =
30 "@(#) $Header: tcpgram.y,v 1.24 91/06/06 22:36:04 mccanne Exp $ (LBL)";
31 #endif
32
33 #include <stdio.h>
34 #include <sys/types.h>
35 #include <sys/socket.h>
36 #include <net/if.h>
37 #include <netinet/in.h>
38 #include <netinet/if_ether.h>
39
40 #include "interface.h"
41
42 #include <sys/time.h>
43 #include <net/bpf.h>
44
45 #include "gencode.h"
46
47 static struct qual qualifier;
48 static struct qual default_qual = { 0, 0, 0 };
49
50 int n_errors = 0;
51
52 static void
yyerror()53 yyerror()
54 {
55 ++n_errors;
56 }
57
58 #line 56 "tcpgram.y"
59 typedef union {
60 int i;
61 u_long h;
62 u_char *e;
63 char *s;
64 struct stmt *stmt;
65 struct block *blk;
66 struct arth *a;
67 } YYSTYPE;
68 #line 69 "y.tab.c"
69 #define DST 257
70 #define SRC 258
71 #define HOST 259
72 #define GATEWAY 260
73 #define NET 261
74 #define PORT 262
75 #define LESS 263
76 #define GREATER 264
77 #define PROTO 265
78 #define BYTE 266
79 #define ARP 267
80 #define RARP 268
81 #define IP 269
82 #define TCP 270
83 #define UDP 271
84 #define ICMP 272
85 #define BROADCAST 273
86 #define NUM 274
87 #define ETHER 275
88 #define GEQ 276
89 #define LEQ 277
90 #define NEQ 278
91 #define ID 279
92 #define EID 280
93 #define HID 281
94 #define LSH 282
95 #define RSH 283
96 #define LEN 284
97 #define OR 285
98 #define AND 286
99 #define UMINUS 287
100 #define YYERRCODE 256
101 short yylhs[] = { -1,
102 0, 0, 1, 1, 1, 1, 1, 2, 2, 2,
103 3, 3, 3, 3, 4, 4, 4, 8, 8, 5,
104 5, 16, 16, 16, 16, 16, 6, 6, 6, 6,
105 6, 6, 17, 17, 18, 18, 18, 18, 18, 18,
106 19, 19, 19, 20, 12, 12, 12, 12, 12, 12,
107 12, 7, 7, 7, 7, 14, 14, 14, 15, 15,
108 15, 9, 9, 10, 10, 10, 10, 10, 10, 10,
109 10, 10, 10, 10, 10, 10, 11, 11, 11, 11,
110 11, 13, 13,
111 };
112 short yylen[] = { 2,
113 1, 0, 1, 3, 3, 3, 3, 1, 1, 3,
114 1, 1, 1, 2, 1, 3, 3, 1, 1, 1,
115 2, 3, 2, 2, 2, 2, 2, 3, 1, 3,
116 3, 1, 1, 0, 1, 1, 3, 3, 3, 3,
117 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
118 1, 1, 2, 2, 4, 1, 1, 1, 1, 1,
119 1, 1, 1, 4, 6, 3, 3, 3, 3, 3,
120 3, 3, 3, 2, 3, 1, 1, 1, 1, 1,
121 1, 1, 3,
122 };
123 short yydefred[] = { 0,
124 0, 0, 0, 47, 48, 46, 49, 50, 51, 52,
125 82, 45, 76, 0, 0, 0, 0, 0, 3, 20,
126 32, 0, 63, 0, 62, 0, 0, 53, 54, 0,
127 21, 0, 74, 0, 0, 0, 0, 0, 0, 57,
128 59, 61, 0, 0, 0, 0, 0, 0, 0, 0,
129 56, 58, 60, 0, 0, 0, 11, 13, 12, 0,
130 0, 27, 8, 9, 0, 0, 41, 44, 42, 43,
131 25, 0, 24, 26, 78, 77, 80, 81, 79, 0,
132 0, 28, 75, 83, 0, 0, 7, 5, 0, 6,
133 4, 0, 0, 0, 0, 0, 0, 68, 69, 0,
134 0, 0, 14, 0, 15, 0, 0, 0, 0, 0,
135 0, 0, 22, 55, 0, 64, 0, 0, 10, 0,
136 0, 38, 40, 37, 39, 0, 17, 16, 65,
137 };
138 short yydgoto[] = { 17,
139 35, 103, 63, 106, 19, 20, 21, 107, 22, 23,
140 80, 34, 25, 54, 55, 26, 27, 72, 73, 74,
141 };
142 short yysindex[] = { 131,
143 -271, -263, -261, 0, 0, 0, 0, 0, 0, 0,
144 0, 0, 0, 131, 240, 131, 0, -268, 0, 0,
145 0, 407, 0, -72, 0, 151, -36, 0, 0, -30,
146 0, 240, 0, -72, -34, -19, -17, -31, -31, 0,
147 0, 0, 240, 240, 240, 240, 240, 240, 240, 240,
148 0, 0, 0, 240, 240, 240, 0, 0, 0, 151,
149 159, 0, 0, 0, -226, -206, 0, 0, 0, 0,
150 0, -119, 0, 0, 0, 0, 0, 0, 0, -247,
151 -22, 0, 0, 0, -31, 112, 0, 0, 0, 0,
152 0, 120, 120, 173, 106, -37, -37, 0, 0, -22,
153 -22, 442, 0, -40, 0, -7, -195, -17, -222, -220,
154 -216, -212, 0, 0, -17, 0, -209, -17, 0, 151,
155 151, 0, 0, 0, 0, -41, 0, 0, 0,
156 };
157 short yyrindex[] = { 108,
158 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
159 0, 0, 0, 99, 0, 99, 0, 54, 0, 0,
160 0, 0, 0, 6, 0, 0, 0, 0, 0, 0,
161 0, 0, 0, 0, 0, 415, 436, 99, 99, 0,
162 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
163 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
164 0, 0, 0, 0, -5, 148, 0, 0, 0, 0,
165 0, 167, 0, 0, 0, 0, 0, 0, 0, 0,
166 0, 0, 0, 0, 99, 99, 0, 0, 1, 0,
167 0, 37, 51, 77, 66, 12, 26, 0, 0, 15,
168 40, 0, 0, 0, 0, -185, 0, -171, 0, 0,
169 0, 0, 0, 0, 135, 0, 0, 0, 0, 0,
170 0, 0, 0, 0, 0, 0, 0, 0, 0,
171 };
172 short yygindex[] = { 0,
173 68, 84, -57, 0, 44, 0, 0, 0, 508, 17,
174 0, 117, 487, 0, 0, 0, 0, 0, 4, 0,
175 };
176 #define YYTABLESIZE 725
177 short yytable[] = { 104,
178 9, 85, 28, 105, 49, 29, 82, 76, 86, 50,
179 29, 66, 30, 15, 30, 46, 38, 39, 56, 49,
180 47, 83, 48, 84, 50, 67, 114, 36, 105, 79,
181 78, 77, 36, 119, 36, 122, 72, 123, 62, 31,
182 124, 9, 62, 62, 125, 62, 29, 62, 36, 66,
183 73, 129, 66, 1, 66, 30, 66, 31, 109, 110,
184 62, 62, 62, 67, 126, 70, 67, 18, 67, 66,
185 67, 66, 66, 66, 72, 113, 71, 72, 111, 112,
186 31, 88, 91, 67, 0, 67, 67, 67, 73, 120,
187 121, 73, 0, 75, 72, 0, 72, 72, 72, 19,
188 19, 45, 36, 70, 66, 0, 70, 2, 73, 62,
189 73, 73, 73, 18, 18, 0, 24, 71, 67, 0,
190 0, 87, 90, 70, 62, 70, 70, 70, 31, 72,
191 24, 0, 24, 0, 71, 66, 71, 71, 71, 67,
192 0, 69, 70, 73, 85, 0, 0, 49, 47, 67,
193 48, 16, 50, 0, 24, 24, 15, 0, 70, 0,
194 72, 49, 47, 14, 48, 0, 50, 0, 0, 71,
195 16, 0, 62, 0, 73, 15, 62, 62, 0, 62,
196 35, 62, 0, 60, 0, 0, 0, 35, 0, 70,
197 61, 60, 0, 0, 62, 62, 62, 0, 104, 23,
198 71, 24, 24, 127, 128, 0, 23, 0, 0, 0,
199 46, 0, 0, 0, 49, 47, 0, 48, 0, 50,
200 65, 66, 67, 68, 69, 70, 0, 0, 71, 0,
201 0, 1, 2, 11, 3, 4, 5, 6, 7, 8,
202 9, 10, 11, 12, 0, 0, 0, 57, 58, 59,
203 38, 39, 13, 36, 0, 36, 36, 0, 62, 43,
204 44, 0, 33, 33, 33, 33, 33, 33, 36, 0,
205 33, 0, 0, 36, 36, 36, 62, 62, 62, 32,
206 0, 0, 62, 62, 15, 9, 9, 66, 66, 66,
207 29, 29, 0, 66, 66, 0, 66, 66, 0, 30,
208 30, 67, 67, 67, 0, 0, 0, 67, 67, 0,
209 67, 67, 72, 72, 72, 0, 0, 0, 72, 72,
210 0, 72, 72, 0, 31, 31, 73, 73, 73, 0,
211 0, 0, 73, 73, 0, 73, 73, 0, 0, 0,
212 0, 70, 70, 70, 0, 0, 0, 0, 0, 0,
213 70, 70, 71, 71, 71, 34, 34, 34, 34, 34,
214 34, 71, 71, 34, 34, 34, 34, 34, 34, 34,
215 0, 0, 34, 0, 1, 2, 0, 3, 4, 5,
216 6, 7, 8, 9, 10, 11, 12, 43, 44, 0,
217 57, 58, 59, 1, 2, 13, 3, 4, 5, 6,
218 7, 8, 9, 10, 11, 12, 35, 0, 35, 35,
219 62, 62, 62, 0, 13, 0, 62, 62, 0, 18,
220 18, 35, 0, 0, 11, 0, 35, 35, 35, 57,
221 58, 59, 11, 0, 0, 0, 0, 57, 58, 59,
222 23, 0, 0, 0, 46, 23, 23, 23, 49, 47,
223 0, 48, 63, 50, 43, 44, 63, 63, 0, 63,
224 0, 63, 0, 0, 0, 0, 53, 52, 51, 0,
225 0, 0, 0, 62, 63, 63, 63, 62, 62, 46,
226 62, 0, 62, 49, 47, 0, 48, 0, 50, 0,
227 0, 0, 0, 0, 0, 62, 62, 62, 0, 117,
228 0, 0, 37, 0, 0, 0, 4, 5, 6, 7,
229 8, 9, 64, 11, 12, 0, 0, 0, 37, 0,
230 0, 0, 33, 13, 89, 89, 0, 0, 0, 0,
231 45, 0, 0, 0, 116, 0, 0, 0, 63, 81,
232 0, 0, 0, 0, 0, 0, 64, 108, 0, 0,
233 92, 93, 94, 95, 96, 97, 98, 99, 0, 62,
234 0, 100, 101, 102, 0, 45, 0, 0, 0, 0,
235 0, 89, 115, 0, 0, 0, 0, 0, 0, 0,
236 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
237 118, 0, 0, 0, 0, 0, 0, 0, 0, 0,
238 0, 0, 0, 0, 0, 0, 64, 64, 0, 0,
239 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
240 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
241 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
242 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
243 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
244 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
245 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
246 0, 0, 40, 41, 42, 0, 0, 0, 43, 44,
247 63, 63, 63, 0, 0, 0, 63, 63, 0, 0,
248 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
249 0, 62, 62, 62, 0, 0, 0, 62, 62, 0,
250 0, 0, 0, 43, 44,
251 };
252 short yycheck[] = { 40,
253 0, 33, 274, 61, 42, 0, 41, 38, 40, 47,
254 274, 0, 274, 45, 0, 38, 285, 286, 91, 42,
255 43, 41, 45, 41, 47, 0, 274, 33, 86, 60,
256 61, 62, 16, 41, 40, 258, 0, 258, 38, 0,
257 257, 41, 42, 43, 257, 45, 41, 47, 32, 38,
258 0, 93, 41, 0, 43, 41, 45, 14, 285, 286,
259 60, 61, 62, 38, 274, 0, 41, 0, 43, 58,
260 45, 60, 61, 62, 38, 72, 0, 41, 285, 286,
261 41, 38, 39, 58, -1, 60, 61, 62, 38, 285,
262 286, 41, -1, 124, 58, -1, 60, 61, 62, 285,
263 286, 124, 86, 38, 93, -1, 41, 0, 58, 26,
264 60, 61, 62, 285, 286, -1, 0, 41, 93, -1,
265 -1, 38, 39, 58, 124, 60, 61, 62, 85, 93,
266 14, -1, 16, -1, 58, 124, 60, 61, 62, 259,
267 -1, 261, 262, 93, 33, -1, -1, 42, 43, 124,
268 45, 40, 47, -1, 38, 39, 45, -1, 93, -1,
269 124, 42, 43, 33, 45, -1, 47, -1, -1, 93,
270 40, -1, 38, -1, 124, 45, 42, 43, -1, 45,
271 33, 47, -1, 33, -1, -1, -1, 40, -1, 124,
272 40, 33, -1, -1, 60, 61, 62, -1, 40, 33,
273 124, 85, 86, 120, 121, -1, 40, -1, -1, -1,
274 38, -1, -1, -1, 42, 43, -1, 45, -1, 47,
275 257, 258, 259, 260, 261, 262, -1, -1, 265, -1,
276 -1, 263, 264, 274, 266, 267, 268, 269, 270, 271,
277 272, 273, 274, 275, -1, -1, -1, 279, 280, 281,
278 285, 286, 284, 259, -1, 261, 262, -1, 124, 282,
279 283, -1, 257, 258, 259, 260, 261, 262, 274, -1,
280 265, -1, -1, 279, 280, 281, 276, 277, 278, 40,
281 -1, -1, 282, 283, 45, 285, 286, 276, 277, 278,
282 285, 286, -1, 282, 283, -1, 285, 286, -1, 285,
283 286, 276, 277, 278, -1, -1, -1, 282, 283, -1,
284 285, 286, 276, 277, 278, -1, -1, -1, 282, 283,
285 -1, 285, 286, -1, 285, 286, 276, 277, 278, -1,
286 -1, -1, 282, 283, -1, 285, 286, -1, -1, -1,
287 -1, 276, 277, 278, -1, -1, -1, -1, -1, -1,
288 285, 286, 276, 277, 278, 257, 258, 259, 260, 261,
289 262, 285, 286, 265, 257, 258, 259, 260, 261, 262,
290 -1, -1, 265, -1, 263, 264, -1, 266, 267, 268,
291 269, 270, 271, 272, 273, 274, 275, 282, 283, -1,
292 279, 280, 281, 263, 264, 284, 266, 267, 268, 269,
293 270, 271, 272, 273, 274, 275, 259, -1, 261, 262,
294 276, 277, 278, -1, 284, -1, 282, 283, -1, 285,
295 286, 274, -1, -1, 274, -1, 279, 280, 281, 279,
296 280, 281, 274, -1, -1, -1, -1, 279, 280, 281,
297 274, -1, -1, -1, 38, 279, 280, 281, 42, 43,
298 -1, 45, 38, 47, 282, 283, 42, 43, -1, 45,
299 -1, 47, -1, -1, -1, -1, 60, 61, 62, -1,
300 -1, -1, -1, 38, 60, 61, 62, 42, 43, 38,
301 45, -1, 47, 42, 43, -1, 45, -1, 47, -1,
302 -1, -1, -1, -1, -1, 60, 61, 62, -1, 58,
303 -1, -1, 16, -1, -1, -1, 267, 268, 269, 270,
304 271, 272, 26, 274, 275, -1, -1, -1, 32, -1,
305 -1, -1, 15, 284, 38, 39, -1, -1, -1, -1,
306 124, -1, -1, -1, 93, -1, -1, -1, 124, 32,
307 -1, -1, -1, -1, -1, -1, 60, 61, -1, -1,
308 43, 44, 45, 46, 47, 48, 49, 50, -1, 124,
309 -1, 54, 55, 56, -1, 124, -1, -1, -1, -1,
310 -1, 85, 86, -1, -1, -1, -1, -1, -1, -1,
311 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
312 104, -1, -1, -1, -1, -1, -1, -1, -1, -1,
313 -1, -1, -1, -1, -1, -1, 120, 121, -1, -1,
314 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
315 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
316 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
317 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
318 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
319 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
320 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
321 -1, -1, 276, 277, 278, -1, -1, -1, 282, 283,
322 276, 277, 278, -1, -1, -1, 282, 283, -1, -1,
323 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
324 -1, 276, 277, 278, -1, -1, -1, 282, 283, -1,
325 -1, -1, -1, 282, 283,
326 };
327 #define YYFINAL 17
328 #ifndef YYDEBUG
329 #define YYDEBUG 0
330 #endif
331 #define YYMAXTOKEN 287
332 #if YYDEBUG
333 char *yyname[] = {
334 "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
335 "'!'",0,0,0,0,"'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0,0,0,
336 0,"':'",0,"'<'","'='","'>'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
337 0,0,"'['",0,"']'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
338 "'|'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
339 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
340 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
341 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"DST","SRC","HOST","GATEWAY","NET","PORT","LESS",
342 "GREATER","PROTO","BYTE","ARP","RARP","IP","TCP","UDP","ICMP","BROADCAST","NUM",
343 "ETHER","GEQ","LEQ","NEQ","ID","EID","HID","LSH","RSH","LEN","OR","AND",
344 "UMINUS",
345 };
346 char *yyrule[] = {
347 "$accept : prog",
348 "prog : expr",
349 "prog :",
350 "expr : term",
351 "expr : expr AND term",
352 "expr : expr OR term",
353 "expr : expr AND id",
354 "expr : expr OR id",
355 "id : nid",
356 "id : pnum",
357 "id : '(' pid ')'",
358 "nid : ID",
359 "nid : HID",
360 "nid : EID",
361 "nid : '!' id",
362 "pid : nid",
363 "pid : qid AND id",
364 "pid : qid OR id",
365 "qid : pnum",
366 "qid : pid",
367 "term : rterm",
368 "term : '!' term",
369 "head : pqual dqual aqual",
370 "head : pqual dqual",
371 "head : pqual aqual",
372 "head : pqual PROTO",
373 "head : pqual ndaqual",
374 "rterm : head id",
375 "rterm : '(' expr ')'",
376 "rterm : pname",
377 "rterm : arth relop arth",
378 "rterm : arth irelop arth",
379 "rterm : other",
380 "pqual : pname",
381 "pqual :",
382 "dqual : SRC",
383 "dqual : DST",
384 "dqual : SRC OR DST",
385 "dqual : DST OR SRC",
386 "dqual : SRC AND DST",
387 "dqual : DST AND SRC",
388 "aqual : HOST",
389 "aqual : NET",
390 "aqual : PORT",
391 "ndaqual : GATEWAY",
392 "pname : ETHER",
393 "pname : IP",
394 "pname : ARP",
395 "pname : RARP",
396 "pname : TCP",
397 "pname : UDP",
398 "pname : ICMP",
399 "other : BROADCAST",
400 "other : LESS NUM",
401 "other : GREATER NUM",
402 "other : BYTE NUM byteop NUM",
403 "relop : '>'",
404 "relop : GEQ",
405 "relop : '='",
406 "irelop : LEQ",
407 "irelop : '<'",
408 "irelop : NEQ",
409 "arth : pnum",
410 "arth : narth",
411 "narth : pname '[' arth ']'",
412 "narth : pname '[' arth ':' NUM ']'",
413 "narth : arth '+' arth",
414 "narth : arth '-' arth",
415 "narth : arth '*' arth",
416 "narth : arth '/' arth",
417 "narth : arth '&' arth",
418 "narth : arth '|' arth",
419 "narth : arth LSH arth",
420 "narth : arth RSH arth",
421 "narth : '-' arth",
422 "narth : '(' narth ')'",
423 "narth : LEN",
424 "byteop : '&'",
425 "byteop : '|'",
426 "byteop : '<'",
427 "byteop : '>'",
428 "byteop : '='",
429 "pnum : NUM",
430 "pnum : '(' pnum ')'",
431 };
432 #endif
433 #define yyclearin (yychar=(-1))
434 #define yyerrok (yyerrflag=0)
435 #ifdef YYSTACKSIZE
436 #ifndef YYMAXDEPTH
437 #define YYMAXDEPTH YYSTACKSIZE
438 #endif
439 #else
440 #ifdef YYMAXDEPTH
441 #define YYSTACKSIZE YYMAXDEPTH
442 #else
443 #define YYSTACKSIZE 500
444 #define YYMAXDEPTH 500
445 #endif
446 #endif
447 int yydebug;
448 int yynerrs;
449 int yyerrflag;
450 int yychar;
451 short *yyssp;
452 YYSTYPE *yyvsp;
453 YYSTYPE yyval;
454 YYSTYPE yylval;
455 short yyss[YYSTACKSIZE];
456 YYSTYPE yyvs[YYSTACKSIZE];
457 #define yystacksize YYSTACKSIZE
458 #define YYABORT goto yyabort
459 #define YYACCEPT goto yyaccept
460 #define YYERROR goto yyerrlab
461 int
yyparse()462 yyparse()
463 {
464 register int yym, yyn, yystate;
465 #if YYDEBUG
466 register char *yys;
467 extern char *getenv();
468
469 if (yys = getenv("YYDEBUG"))
470 {
471 yyn = *yys;
472 if (yyn >= '0' && yyn <= '9')
473 yydebug = yyn - '0';
474 }
475 #endif
476
477 yynerrs = 0;
478 yyerrflag = 0;
479 yychar = (-1);
480
481 yyssp = yyss;
482 yyvsp = yyvs;
483 *yyssp = yystate = 0;
484
485 yyloop:
486 if (yyn = yydefred[yystate]) goto yyreduce;
487 if (yychar < 0)
488 {
489 if ((yychar = yylex()) < 0) yychar = 0;
490 #if YYDEBUG
491 if (yydebug)
492 {
493 yys = 0;
494 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
495 if (!yys) yys = "illegal-symbol";
496 printf("yydebug: state %d, reading %d (%s)\n", yystate,
497 yychar, yys);
498 }
499 #endif
500 }
501 if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
502 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
503 {
504 #if YYDEBUG
505 if (yydebug)
506 printf("yydebug: state %d, shifting to state %d\n",
507 yystate, yytable[yyn]);
508 #endif
509 if (yyssp >= yyss + yystacksize - 1)
510 {
511 goto yyoverflow;
512 }
513 *++yyssp = yystate = yytable[yyn];
514 *++yyvsp = yylval;
515 yychar = (-1);
516 if (yyerrflag > 0) --yyerrflag;
517 goto yyloop;
518 }
519 if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
520 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
521 {
522 yyn = yytable[yyn];
523 goto yyreduce;
524 }
525 if (yyerrflag) goto yyinrecovery;
526 #ifdef lint
527 goto yynewerror;
528 #endif
529 yynewerror:
530 yyerror("syntax error");
531 #ifdef lint
532 goto yyerrlab;
533 #endif
534 yyerrlab:
535 ++yynerrs;
536 yyinrecovery:
537 if (yyerrflag < 3)
538 {
539 yyerrflag = 3;
540 for (;;)
541 {
542 if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
543 yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
544 {
545 #if YYDEBUG
546 if (yydebug)
547 printf("yydebug: state %d, error recovery shifting\
548 to state %d\n", *yyssp, yytable[yyn]);
549 #endif
550 if (yyssp >= yyss + yystacksize - 1)
551 {
552 goto yyoverflow;
553 }
554 *++yyssp = yystate = yytable[yyn];
555 *++yyvsp = yylval;
556 goto yyloop;
557 }
558 else
559 {
560 #if YYDEBUG
561 if (yydebug)
562 printf("yydebug: error recovery discarding state %d\n",
563 *yyssp);
564 #endif
565 if (yyssp <= yyss) goto yyabort;
566 --yyssp;
567 --yyvsp;
568 }
569 }
570 }
571 else
572 {
573 if (yychar == 0) goto yyabort;
574 #if YYDEBUG
575 if (yydebug)
576 {
577 yys = 0;
578 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
579 if (!yys) yys = "illegal-symbol";
580 printf("yydebug: state %d, error recovery discards token %d (%s)\n",
581 yystate, yychar, yys);
582 }
583 #endif
584 yychar = (-1);
585 goto yyloop;
586 }
587 yyreduce:
588 #if YYDEBUG
589 if (yydebug)
590 printf("yydebug: state %d, reducing by rule %d (%s)\n",
591 yystate, yyn, yyrule[yyn]);
592 #endif
593 yym = yylen[yyn];
594 yyval = yyvsp[1-yym];
595 switch (yyn)
596 {
597 case 1:
598 #line 96 "tcpgram.y"
599 {
600 finish_parse(yyvsp[0].blk);
601 }
602 break;
603 case 4:
604 #line 102 "tcpgram.y"
605 { gen_and(yyvsp[-2].blk, yyval.blk = yyvsp[0].blk); }
606 break;
607 case 5:
608 #line 103 "tcpgram.y"
609 { gen_or(yyvsp[-2].blk, yyval.blk = yyvsp[0].blk); }
610 break;
611 case 6:
612 #line 104 "tcpgram.y"
613 { gen_and(yyvsp[-2].blk, yyval.blk = yyvsp[0].blk); }
614 break;
615 case 7:
616 #line 105 "tcpgram.y"
617 { gen_or(yyvsp[-2].blk, yyval.blk = yyvsp[0].blk); }
618 break;
619 case 9:
620 #line 108 "tcpgram.y"
621 { yyval.blk = gen_ncode((u_long)yyvsp[0].i, qualifier); }
622 break;
623 case 10:
624 #line 109 "tcpgram.y"
625 { yyval.blk = yyvsp[-1].blk; }
626 break;
627 case 11:
628 #line 111 "tcpgram.y"
629 { yyval.blk = gen_scode(yyvsp[0].s, qualifier); }
630 break;
631 case 12:
632 #line 112 "tcpgram.y"
633 { yyval.blk = gen_ncode(yyvsp[0].h, qualifier); }
634 break;
635 case 13:
636 #line 113 "tcpgram.y"
637 { yyval.blk = gen_ecode(yyvsp[0].e, qualifier); }
638 break;
639 case 14:
640 #line 114 "tcpgram.y"
641 { gen_not(yyvsp[0].blk); yyval.blk = yyvsp[0].blk; }
642 break;
643 case 16:
644 #line 117 "tcpgram.y"
645 { gen_and(yyvsp[-2].blk, yyval.blk = yyvsp[0].blk); }
646 break;
647 case 17:
648 #line 118 "tcpgram.y"
649 { gen_or(yyvsp[-2].blk, yyval.blk = yyvsp[0].blk); }
650 break;
651 case 18:
652 #line 120 "tcpgram.y"
653 { yyval.blk = gen_ncode((u_long)yyvsp[0].i, qualifier); }
654 break;
655 case 21:
656 #line 124 "tcpgram.y"
657 { gen_not(yyvsp[0].blk); yyval.blk = yyvsp[0].blk; }
658 break;
659 case 25:
660 #line 129 "tcpgram.y"
661 { qualifier.primary = Q_PROTO; }
662 break;
663 case 27:
664 #line 132 "tcpgram.y"
665 { yyval.blk = yyvsp[0].blk; }
666 break;
667 case 28:
668 #line 133 "tcpgram.y"
669 { yyval.blk = yyvsp[-1].blk; qualifier = default_qual; }
670 break;
671 case 29:
672 #line 134 "tcpgram.y"
673 { yyval.blk = gen_proto_abbrev(yyvsp[0].i);
674 qualifier = default_qual; }
675 break;
676 case 30:
677 #line 136 "tcpgram.y"
678 { yyval.blk = gen_relation(yyvsp[-1].i, yyvsp[-2].a, yyvsp[0].a, 0);
679 qualifier = default_qual; }
680 break;
681 case 31:
682 #line 138 "tcpgram.y"
683 { yyval.blk = gen_relation(yyvsp[-1].i, yyvsp[-2].a, yyvsp[0].a, 1);
684 qualifier = default_qual; }
685 break;
686 case 33:
687 #line 143 "tcpgram.y"
688 { qualifier.protocol = yyvsp[0].i; }
689 break;
690 case 34:
691 #line 144 "tcpgram.y"
692 { qualifier.protocol = 0; }
693 break;
694 case 35:
695 #line 147 "tcpgram.y"
696 { qualifier.dir = Q_SRC; }
697 break;
698 case 36:
699 #line 148 "tcpgram.y"
700 { qualifier.dir = Q_DST; }
701 break;
702 case 37:
703 #line 149 "tcpgram.y"
704 { qualifier.dir = Q_OR; }
705 break;
706 case 38:
707 #line 150 "tcpgram.y"
708 { qualifier.dir = Q_OR; }
709 break;
710 case 39:
711 #line 151 "tcpgram.y"
712 { qualifier.dir = Q_AND; }
713 break;
714 case 40:
715 #line 152 "tcpgram.y"
716 { qualifier.dir = Q_AND; }
717 break;
718 case 41:
719 #line 155 "tcpgram.y"
720 { qualifier.primary = Q_HOST; }
721 break;
722 case 42:
723 #line 156 "tcpgram.y"
724 { qualifier.primary = Q_NET; }
725 break;
726 case 43:
727 #line 157 "tcpgram.y"
728 { qualifier.primary = Q_PORT; }
729 break;
730 case 44:
731 #line 160 "tcpgram.y"
732 { qualifier.primary = Q_GATEWAY; }
733 break;
734 case 45:
735 #line 162 "tcpgram.y"
736 { yyval.i = Q_ETHER; }
737 break;
738 case 46:
739 #line 163 "tcpgram.y"
740 { yyval.i = Q_IP; }
741 break;
742 case 47:
743 #line 164 "tcpgram.y"
744 { yyval.i = Q_ARP; }
745 break;
746 case 48:
747 #line 165 "tcpgram.y"
748 { yyval.i = Q_RARP; }
749 break;
750 case 49:
751 #line 166 "tcpgram.y"
752 { yyval.i = Q_TCP; }
753 break;
754 case 50:
755 #line 167 "tcpgram.y"
756 { yyval.i = Q_UDP; }
757 break;
758 case 51:
759 #line 168 "tcpgram.y"
760 { yyval.i = Q_ICMP; }
761 break;
762 case 52:
763 #line 170 "tcpgram.y"
764 { yyval.blk = gen_broadcast(); }
765 break;
766 case 53:
767 #line 171 "tcpgram.y"
768 { yyval.blk = gen_less(yyvsp[0].i); }
769 break;
770 case 54:
771 #line 172 "tcpgram.y"
772 { yyval.blk = gen_greater(yyvsp[0].i); }
773 break;
774 case 55:
775 #line 173 "tcpgram.y"
776 { yyval.blk = gen_byteop(yyvsp[-1].i, yyvsp[-2].i, yyvsp[0].i); }
777 break;
778 case 56:
779 #line 175 "tcpgram.y"
780 { yyval.i = BPF_JGT; }
781 break;
782 case 57:
783 #line 176 "tcpgram.y"
784 { yyval.i = BPF_JGE; }
785 break;
786 case 58:
787 #line 177 "tcpgram.y"
788 { yyval.i = BPF_JEQ; }
789 break;
790 case 59:
791 #line 179 "tcpgram.y"
792 { yyval.i = BPF_JGT; }
793 break;
794 case 60:
795 #line 180 "tcpgram.y"
796 { yyval.i = BPF_JGE; }
797 break;
798 case 61:
799 #line 181 "tcpgram.y"
800 { yyval.i = BPF_JEQ; }
801 break;
802 case 62:
803 #line 183 "tcpgram.y"
804 { yyval.a = gen_loadi(yyvsp[0].i); }
805 break;
806 case 64:
807 #line 186 "tcpgram.y"
808 { yyval.a = gen_load(yyvsp[-3].i, yyvsp[-1].a, 1); }
809 break;
810 case 65:
811 #line 187 "tcpgram.y"
812 { yyval.a = gen_load(yyvsp[-5].i, yyvsp[-3].a, yyvsp[-1].i); }
813 break;
814 case 66:
815 #line 188 "tcpgram.y"
816 { yyval.a = gen_arth(BPF_ADD, yyvsp[-2].a, yyvsp[0].a); }
817 break;
818 case 67:
819 #line 189 "tcpgram.y"
820 { yyval.a = gen_arth(BPF_SUB, yyvsp[-2].a, yyvsp[0].a); }
821 break;
822 case 68:
823 #line 190 "tcpgram.y"
824 { yyval.a = gen_arth(BPF_MUL, yyvsp[-2].a, yyvsp[0].a); }
825 break;
826 case 69:
827 #line 191 "tcpgram.y"
828 { yyval.a = gen_arth(BPF_DIV, yyvsp[-2].a, yyvsp[0].a); }
829 break;
830 case 70:
831 #line 192 "tcpgram.y"
832 { yyval.a = gen_arth(BPF_AND, yyvsp[-2].a, yyvsp[0].a); }
833 break;
834 case 71:
835 #line 193 "tcpgram.y"
836 { yyval.a = gen_arth(BPF_OR, yyvsp[-2].a, yyvsp[0].a); }
837 break;
838 case 72:
839 #line 194 "tcpgram.y"
840 { yyval.a = gen_arth(BPF_LSH, yyvsp[-2].a, yyvsp[0].a); }
841 break;
842 case 73:
843 #line 195 "tcpgram.y"
844 { yyval.a = gen_arth(BPF_RSH, yyvsp[-2].a, yyvsp[0].a); }
845 break;
846 case 74:
847 #line 196 "tcpgram.y"
848 { yyval.a = gen_neg(yyvsp[0].a); }
849 break;
850 case 75:
851 #line 197 "tcpgram.y"
852 { yyval.a = yyvsp[-1].a; }
853 break;
854 case 76:
855 #line 198 "tcpgram.y"
856 { yyval.a = gen_loadlen(); }
857 break;
858 case 77:
859 #line 200 "tcpgram.y"
860 { yyval.i = '&'; }
861 break;
862 case 78:
863 #line 201 "tcpgram.y"
864 { yyval.i = '|'; }
865 break;
866 case 79:
867 #line 202 "tcpgram.y"
868 { yyval.i = '<'; }
869 break;
870 case 80:
871 #line 203 "tcpgram.y"
872 { yyval.i = '>'; }
873 break;
874 case 81:
875 #line 204 "tcpgram.y"
876 { yyval.i = '='; }
877 break;
878 case 83:
879 #line 207 "tcpgram.y"
880 { yyval.i = yyvsp[-1].i; }
881 break;
882 #line 883 "y.tab.c"
883 }
884 yyssp -= yym;
885 yystate = *yyssp;
886 yyvsp -= yym;
887 yym = yylhs[yyn];
888 if (yystate == 0 && yym == 0)
889 {
890 #if YYDEBUG
891 if (yydebug)
892 printf("yydebug: after reduction, shifting from state 0 to\
893 state %d\n", YYFINAL);
894 #endif
895 yystate = YYFINAL;
896 *++yyssp = YYFINAL;
897 *++yyvsp = yyval;
898 if (yychar < 0)
899 {
900 if ((yychar = yylex()) < 0) yychar = 0;
901 #if YYDEBUG
902 if (yydebug)
903 {
904 yys = 0;
905 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
906 if (!yys) yys = "illegal-symbol";
907 printf("yydebug: state %d, reading %d (%s)\n",
908 YYFINAL, yychar, yys);
909 }
910 #endif
911 }
912 if (yychar == 0) goto yyaccept;
913 goto yyloop;
914 }
915 if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
916 yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
917 yystate = yytable[yyn];
918 else
919 yystate = yydgoto[yym];
920 #if YYDEBUG
921 if (yydebug)
922 printf("yydebug: after reduction, shifting from state %d \
923 to state %d\n", *yyssp, yystate);
924 #endif
925 if (yyssp >= yyss + yystacksize - 1)
926 {
927 goto yyoverflow;
928 }
929 *++yyssp = yystate;
930 *++yyvsp = yyval;
931 goto yyloop;
932 yyoverflow:
933 yyerror("yacc stack overflow");
934 yyabort:
935 return (1);
936 yyaccept:
937 return (0);
938 }
939