xref: /aosp_15_r20/external/iproute2/tc/emp_ematch.y (revision de1e4e894b0c224df933550f0afdecc354b238c4)
1*de1e4e89SAndroid Build Coastguard Worker %{
2*de1e4e89SAndroid Build Coastguard Worker  #include <stdio.h>
3*de1e4e89SAndroid Build Coastguard Worker  #include <stdlib.h>
4*de1e4e89SAndroid Build Coastguard Worker  #include <malloc.h>
5*de1e4e89SAndroid Build Coastguard Worker  #include <string.h>
6*de1e4e89SAndroid Build Coastguard Worker  #include "m_ematch.h"
7*de1e4e89SAndroid Build Coastguard Worker %}
8*de1e4e89SAndroid Build Coastguard Worker 
9*de1e4e89SAndroid Build Coastguard Worker %locations
10*de1e4e89SAndroid Build Coastguard Worker %token-table
11*de1e4e89SAndroid Build Coastguard Worker %error-verbose
12*de1e4e89SAndroid Build Coastguard Worker %name-prefix "ematch_"
13*de1e4e89SAndroid Build Coastguard Worker 
14*de1e4e89SAndroid Build Coastguard Worker %union {
15*de1e4e89SAndroid Build Coastguard Worker 	unsigned int i;
16*de1e4e89SAndroid Build Coastguard Worker 	struct bstr *b;
17*de1e4e89SAndroid Build Coastguard Worker 	struct ematch *e;
18*de1e4e89SAndroid Build Coastguard Worker }
19*de1e4e89SAndroid Build Coastguard Worker 
20*de1e4e89SAndroid Build Coastguard Worker %{
21*de1e4e89SAndroid Build Coastguard Worker  extern int ematch_lex(void);
22*de1e4e89SAndroid Build Coastguard Worker  extern void yyerror(const char *s);
23*de1e4e89SAndroid Build Coastguard Worker  extern struct ematch *ematch_root;
24*de1e4e89SAndroid Build Coastguard Worker  extern char *ematch_err;
25*de1e4e89SAndroid Build Coastguard Worker %}
26*de1e4e89SAndroid Build Coastguard Worker 
27*de1e4e89SAndroid Build Coastguard Worker %token <i> ERROR
28*de1e4e89SAndroid Build Coastguard Worker %token <b> ATTRIBUTE
29*de1e4e89SAndroid Build Coastguard Worker %token <i> AND OR NOT
30*de1e4e89SAndroid Build Coastguard Worker %type <i> invert relation
31*de1e4e89SAndroid Build Coastguard Worker %type <e> match expr
32*de1e4e89SAndroid Build Coastguard Worker %type <b> args
33*de1e4e89SAndroid Build Coastguard Worker %right AND OR
34*de1e4e89SAndroid Build Coastguard Worker %start input
35*de1e4e89SAndroid Build Coastguard Worker %%
36*de1e4e89SAndroid Build Coastguard Worker input:
37*de1e4e89SAndroid Build Coastguard Worker 	/* empty */
38*de1e4e89SAndroid Build Coastguard Worker 	| expr
39*de1e4e89SAndroid Build Coastguard Worker 		{ ematch_root = $1; }
40*de1e4e89SAndroid Build Coastguard Worker 	| expr error
41*de1e4e89SAndroid Build Coastguard Worker 		{
42*de1e4e89SAndroid Build Coastguard Worker 			ematch_root = $1;
43*de1e4e89SAndroid Build Coastguard Worker 			YYACCEPT;
44*de1e4e89SAndroid Build Coastguard Worker 		}
45*de1e4e89SAndroid Build Coastguard Worker 	;
46*de1e4e89SAndroid Build Coastguard Worker 
47*de1e4e89SAndroid Build Coastguard Worker expr:
48*de1e4e89SAndroid Build Coastguard Worker 	match
49*de1e4e89SAndroid Build Coastguard Worker 		{ $$ = $1; }
50*de1e4e89SAndroid Build Coastguard Worker 	| match relation expr
51*de1e4e89SAndroid Build Coastguard Worker 		{
52*de1e4e89SAndroid Build Coastguard Worker 			$1->relation = $2;
53*de1e4e89SAndroid Build Coastguard Worker 			$1->next = $3;
54*de1e4e89SAndroid Build Coastguard Worker 			$$ = $1;
55*de1e4e89SAndroid Build Coastguard Worker 		}
56*de1e4e89SAndroid Build Coastguard Worker 	;
57*de1e4e89SAndroid Build Coastguard Worker 
58*de1e4e89SAndroid Build Coastguard Worker match:
59*de1e4e89SAndroid Build Coastguard Worker 	invert ATTRIBUTE '(' args ')'
60*de1e4e89SAndroid Build Coastguard Worker 		{
61*de1e4e89SAndroid Build Coastguard Worker 			$2->next = $4;
62*de1e4e89SAndroid Build Coastguard Worker 			$$ = new_ematch($2, $1);
63*de1e4e89SAndroid Build Coastguard Worker 			if ($$ == NULL)
64*de1e4e89SAndroid Build Coastguard Worker 				YYABORT;
65*de1e4e89SAndroid Build Coastguard Worker 		}
66*de1e4e89SAndroid Build Coastguard Worker 	| invert '(' expr ')'
67*de1e4e89SAndroid Build Coastguard Worker 		{
68*de1e4e89SAndroid Build Coastguard Worker 			$$ = new_ematch(NULL, $1);
69*de1e4e89SAndroid Build Coastguard Worker 			if ($$ == NULL)
70*de1e4e89SAndroid Build Coastguard Worker 				YYABORT;
71*de1e4e89SAndroid Build Coastguard Worker 			$$->child = $3;
72*de1e4e89SAndroid Build Coastguard Worker 		}
73*de1e4e89SAndroid Build Coastguard Worker 	;
74*de1e4e89SAndroid Build Coastguard Worker 
75*de1e4e89SAndroid Build Coastguard Worker args:
76*de1e4e89SAndroid Build Coastguard Worker 	ATTRIBUTE
77*de1e4e89SAndroid Build Coastguard Worker 		{ $$ = $1; }
78*de1e4e89SAndroid Build Coastguard Worker 	| ATTRIBUTE args
79*de1e4e89SAndroid Build Coastguard Worker 		{ $1->next = $2; }
80*de1e4e89SAndroid Build Coastguard Worker 	;
81*de1e4e89SAndroid Build Coastguard Worker 
82*de1e4e89SAndroid Build Coastguard Worker relation:
83*de1e4e89SAndroid Build Coastguard Worker 	AND
84*de1e4e89SAndroid Build Coastguard Worker 		{ $$ = TCF_EM_REL_AND; }
85*de1e4e89SAndroid Build Coastguard Worker 	| OR
86*de1e4e89SAndroid Build Coastguard Worker 		{ $$ = TCF_EM_REL_OR; }
87*de1e4e89SAndroid Build Coastguard Worker 	;
88*de1e4e89SAndroid Build Coastguard Worker 
89*de1e4e89SAndroid Build Coastguard Worker invert:
90*de1e4e89SAndroid Build Coastguard Worker 	/* empty */
91*de1e4e89SAndroid Build Coastguard Worker 		{ $$ = 0; }
92*de1e4e89SAndroid Build Coastguard Worker 	| NOT
93*de1e4e89SAndroid Build Coastguard Worker 		{ $$ = 1; }
94*de1e4e89SAndroid Build Coastguard Worker 	;
95*de1e4e89SAndroid Build Coastguard Worker %%
96*de1e4e89SAndroid Build Coastguard Worker 
97*de1e4e89SAndroid Build Coastguard Worker  void yyerror(const char *s)
98*de1e4e89SAndroid Build Coastguard Worker  {
99*de1e4e89SAndroid Build Coastguard Worker 	 ematch_err = strdup(s);
100*de1e4e89SAndroid Build Coastguard Worker  }
101