40 * Invariants:
41 *
42 * unclaimed_tokens == NULL IFF unclaimed_tokens_size == 0
43 * unclaimed_tokens_size == 0 IFF num_unclaimed_tokens == 0
44 */
45 static char **unclaimed_tokens; /* TOKENs produced by Lex (see below) */
46 /* but not claimed by YACC reduction */
47 /* rules */
48 static unsigned int unclaimed_tokens_size; /* size of unclaimed_tokens */
49 static unsigned int num_unclaimed_tokens; /* number of unclaimed TOKENs */
50
51 int lex_lineno = 1; /* line number for error reporting */
52 static int state = INITIAL;
53 extern boolean_t cmd_file_mode;
54 extern boolean_t saw_error;
55 extern void yyerror(char *s);
56
57 static char *create_token(char *s);
58 %}
59
60 %a 7000
61 %p 5000
62 %e 2000
63 %n 1000
64
65 %{
66 /*
67 * The three states below are for tokens, lists and complex property values.
68 * Note that simple property values are a subset of tokens.
69 */
70 %}
71 %s TSTATE
72 %s LSTATE
73 %s CSTATE
74 %%
75
76 <INITIAL>"#"[^\n]* { }
77
78 <INITIAL>add {
79 BEGIN TSTATE;
80 state = TSTATE;
81 return ADD;
82 }
83
219 <CSTATE>type { return TYPE; }
220
221 <TSTATE>value { return VALUE; }
222 <CSTATE>value { return VALUE; }
223
224 <TSTATE>options { return OPTIONS; }
225 <CSTATE>options { return OPTIONS; }
226
227 <TSTATE>allowed-address { return ALLOWED_ADDRESS; }
228 <CSTATE>allowed-address { return ALLOWED_ADDRESS; }
229
230 <TSTATE>address { return ADDRESS; }
231 <CSTATE>address { return ADDRESS; }
232
233 <TSTATE>physical { return PHYSICAL; }
234 <CSTATE>physical { return PHYSICAL; }
235
236 <TSTATE>defrouter { return DEFROUTER; }
237 <CSTATE>defrouter { return DEFROUTER; }
238
239 <TSTATE>dir { return DIR; }
240 <CSTATE>dir { return DIR; }
241
242 <TSTATE>special { return SPECIAL; }
243 <CSTATE>special { return SPECIAL; }
244
245 <TSTATE>raw { return RAW; }
246 <CSTATE>raw { return RAW; }
247
248 <TSTATE>name { return NAME; }
249 <CSTATE>name { return NAME; }
250
251 <TSTATE>match { return MATCH; }
252 <CSTATE>match { return MATCH; }
253
254 <TSTATE>priv { return PRIV; }
255 <CSTATE>priv { return PRIV; }
256
257 <TSTATE>limit { return LIMIT; }
258 <CSTATE>limit { return LIMIT; }
339 return CLOSE_PAREN;
340 }
341
342 <LSTATE>"," { return COMMA; }
343 <CSTATE>"," { return COMMA; }
344
345 <TSTATE>[^ \t\n\";=\[\]\(\)]+ {
346 yylval.strval = create_token(yytext);
347 return TOKEN;
348 }
349
350 <LSTATE>[^ \t\n\",;=\[\]\(\)]+ {
351 yylval.strval = create_token(yytext);
352 return TOKEN;
353 }
354
355 <CSTATE>[^ \t\n\",;=\(\)]+ {
356 yylval.strval = create_token(yytext);
357 return TOKEN;
358 }
359
360 <TSTATE>\"[^\"\n]*[\"\n] {
361 yylval.strval = create_token(yytext + 1);
362 if (yylval.strval[yyleng - 2] == '"')
363 yylval.strval[yyleng - 2] = 0;
364 return TOKEN;
365 }
366
367 <LSTATE>\"[^\"\n]*[\"\n] {
368 yylval.strval = create_token(yytext + 1);
369 if (yylval.strval[yyleng - 2] == '"')
370 yylval.strval[yyleng - 2] = 0;
371 return TOKEN;
372 }
373
374 ";" {
375 BEGIN INITIAL;
376 return (yytext[0]);
377 }
378
|
40 * Invariants:
41 *
42 * unclaimed_tokens == NULL IFF unclaimed_tokens_size == 0
43 * unclaimed_tokens_size == 0 IFF num_unclaimed_tokens == 0
44 */
45 static char **unclaimed_tokens; /* TOKENs produced by Lex (see below) */
46 /* but not claimed by YACC reduction */
47 /* rules */
48 static unsigned int unclaimed_tokens_size; /* size of unclaimed_tokens */
49 static unsigned int num_unclaimed_tokens; /* number of unclaimed TOKENs */
50
51 int lex_lineno = 1; /* line number for error reporting */
52 static int state = INITIAL;
53 extern boolean_t cmd_file_mode;
54 extern boolean_t saw_error;
55 extern void yyerror(char *s);
56
57 static char *create_token(char *s);
58 %}
59
60 %a 8000
61 %p 5000
62 %e 2000
63 %n 1000
64 %o 13000
65
66 %{
67 /*
68 * The three states below are for tokens, lists and complex property values.
69 * Note that simple property values are a subset of tokens.
70 */
71 %}
72 %s TSTATE
73 %s LSTATE
74 %s CSTATE
75 %%
76
77 <INITIAL>"#"[^\n]* { }
78
79 <INITIAL>add {
80 BEGIN TSTATE;
81 state = TSTATE;
82 return ADD;
83 }
84
220 <CSTATE>type { return TYPE; }
221
222 <TSTATE>value { return VALUE; }
223 <CSTATE>value { return VALUE; }
224
225 <TSTATE>options { return OPTIONS; }
226 <CSTATE>options { return OPTIONS; }
227
228 <TSTATE>allowed-address { return ALLOWED_ADDRESS; }
229 <CSTATE>allowed-address { return ALLOWED_ADDRESS; }
230
231 <TSTATE>address { return ADDRESS; }
232 <CSTATE>address { return ADDRESS; }
233
234 <TSTATE>physical { return PHYSICAL; }
235 <CSTATE>physical { return PHYSICAL; }
236
237 <TSTATE>defrouter { return DEFROUTER; }
238 <CSTATE>defrouter { return DEFROUTER; }
239
240 <TSTATE>mac-addr { return MAC; }
241 <CSTATE>mac-addr { return MAC; }
242
243 <TSTATE>vlan-id { return VLANID; }
244 <CSTATE>vlan-id { return VLANID; }
245
246 <TSTATE>global-nic { return GNIC; }
247 <CSTATE>global-nic { return GNIC; }
248
249 <TSTATE>property { return NPROP; }
250 <CSTATE>property { return NPROP; }
251
252 <TSTATE>dir { return DIR; }
253 <CSTATE>dir { return DIR; }
254
255 <TSTATE>special { return SPECIAL; }
256 <CSTATE>special { return SPECIAL; }
257
258 <TSTATE>raw { return RAW; }
259 <CSTATE>raw { return RAW; }
260
261 <TSTATE>name { return NAME; }
262 <CSTATE>name { return NAME; }
263
264 <TSTATE>match { return MATCH; }
265 <CSTATE>match { return MATCH; }
266
267 <TSTATE>priv { return PRIV; }
268 <CSTATE>priv { return PRIV; }
269
270 <TSTATE>limit { return LIMIT; }
271 <CSTATE>limit { return LIMIT; }
352 return CLOSE_PAREN;
353 }
354
355 <LSTATE>"," { return COMMA; }
356 <CSTATE>"," { return COMMA; }
357
358 <TSTATE>[^ \t\n\";=\[\]\(\)]+ {
359 yylval.strval = create_token(yytext);
360 return TOKEN;
361 }
362
363 <LSTATE>[^ \t\n\",;=\[\]\(\)]+ {
364 yylval.strval = create_token(yytext);
365 return TOKEN;
366 }
367
368 <CSTATE>[^ \t\n\",;=\(\)]+ {
369 yylval.strval = create_token(yytext);
370 return TOKEN;
371 }
372
373 <CSTATE>\"[^\"\n]*[\"\n] {
374 yylval.strval = create_token(yytext + 1);
375 if (yylval.strval[yyleng - 2] == '"')
376 yylval.strval[yyleng - 2] = 0;
377 return TOKEN;
378 }
379
380 <TSTATE>\"[^\"\n]*[\"\n] {
381 yylval.strval = create_token(yytext + 1);
382 if (yylval.strval[yyleng - 2] == '"')
383 yylval.strval[yyleng - 2] = 0;
384 return TOKEN;
385 }
386
387 <LSTATE>\"[^\"\n]*[\"\n] {
388 yylval.strval = create_token(yytext + 1);
389 if (yylval.strval[yyleng - 2] == '"')
390 yylval.strval[yyleng - 2] = 0;
391 return TOKEN;
392 }
393
394 ";" {
395 BEGIN INITIAL;
396 return (yytext[0]);
397 }
398
|