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