1311b41454dc445639924c691a949bd15fbfab0cbshemminger%{
2311b41454dc445639924c691a949bd15fbfab0cbshemminger #include <stdio.h>
3311b41454dc445639924c691a949bd15fbfab0cbshemminger #include <stdlib.h>
4311b41454dc445639924c691a949bd15fbfab0cbshemminger #include <malloc.h>
5311b41454dc445639924c691a949bd15fbfab0cbshemminger #include <string.h>
6311b41454dc445639924c691a949bd15fbfab0cbshemminger #include "m_ematch.h"
7311b41454dc445639924c691a949bd15fbfab0cbshemminger%}
8311b41454dc445639924c691a949bd15fbfab0cbshemminger
9311b41454dc445639924c691a949bd15fbfab0cbshemminger%locations
10311b41454dc445639924c691a949bd15fbfab0cbshemminger%token-table
11311b41454dc445639924c691a949bd15fbfab0cbshemminger%error-verbose
12edd3979272e46d17456a4dabc3e9acf59e561d5aStephen Hemminger%name-prefix "ematch_"
13311b41454dc445639924c691a949bd15fbfab0cbshemminger
14311b41454dc445639924c691a949bd15fbfab0cbshemminger%union {
15311b41454dc445639924c691a949bd15fbfab0cbshemminger	unsigned int i;
16311b41454dc445639924c691a949bd15fbfab0cbshemminger	struct bstr *b;
17311b41454dc445639924c691a949bd15fbfab0cbshemminger	struct ematch *e;
18311b41454dc445639924c691a949bd15fbfab0cbshemminger}
19311b41454dc445639924c691a949bd15fbfab0cbshemminger
20311b41454dc445639924c691a949bd15fbfab0cbshemminger%{
21737f15f6da0ed7512220f6fa5244a39777de4e0dshemminger extern int ematch_lex(void);
225761f04fb8f47db22464ad420dd1a99ed842d569Stephen Hemminger extern void yyerror(const char *s);
23311b41454dc445639924c691a949bd15fbfab0cbshemminger extern struct ematch *ematch_root;
24311b41454dc445639924c691a949bd15fbfab0cbshemminger extern char *ematch_err;
25311b41454dc445639924c691a949bd15fbfab0cbshemminger%}
26311b41454dc445639924c691a949bd15fbfab0cbshemminger
27311b41454dc445639924c691a949bd15fbfab0cbshemminger%token <i> ERROR
28311b41454dc445639924c691a949bd15fbfab0cbshemminger%token <b> ATTRIBUTE
29311b41454dc445639924c691a949bd15fbfab0cbshemminger%token <i> AND OR NOT
30311b41454dc445639924c691a949bd15fbfab0cbshemminger%type <i> invert relation
31311b41454dc445639924c691a949bd15fbfab0cbshemminger%type <e> match expr
32311b41454dc445639924c691a949bd15fbfab0cbshemminger%type <b> args
33311b41454dc445639924c691a949bd15fbfab0cbshemminger%right AND OR
34311b41454dc445639924c691a949bd15fbfab0cbshemminger%start input
35311b41454dc445639924c691a949bd15fbfab0cbshemminger%%
36311b41454dc445639924c691a949bd15fbfab0cbshemmingerinput:
37311b41454dc445639924c691a949bd15fbfab0cbshemminger	/* empty */
38311b41454dc445639924c691a949bd15fbfab0cbshemminger	| expr
39311b41454dc445639924c691a949bd15fbfab0cbshemminger		{ ematch_root = $1; }
40311b41454dc445639924c691a949bd15fbfab0cbshemminger	| expr error
41311b41454dc445639924c691a949bd15fbfab0cbshemminger		{
42311b41454dc445639924c691a949bd15fbfab0cbshemminger			ematch_root = $1;
43311b41454dc445639924c691a949bd15fbfab0cbshemminger			YYACCEPT;
44311b41454dc445639924c691a949bd15fbfab0cbshemminger		}
45311b41454dc445639924c691a949bd15fbfab0cbshemminger	;
46311b41454dc445639924c691a949bd15fbfab0cbshemminger
47311b41454dc445639924c691a949bd15fbfab0cbshemmingerexpr:
48311b41454dc445639924c691a949bd15fbfab0cbshemminger	match
49311b41454dc445639924c691a949bd15fbfab0cbshemminger		{ $$ = $1; }
50311b41454dc445639924c691a949bd15fbfab0cbshemminger	| match relation expr
51311b41454dc445639924c691a949bd15fbfab0cbshemminger		{
52311b41454dc445639924c691a949bd15fbfab0cbshemminger			$1->relation = $2;
53311b41454dc445639924c691a949bd15fbfab0cbshemminger			$1->next = $3;
54311b41454dc445639924c691a949bd15fbfab0cbshemminger			$$ = $1;
55311b41454dc445639924c691a949bd15fbfab0cbshemminger		}
56311b41454dc445639924c691a949bd15fbfab0cbshemminger	;
57311b41454dc445639924c691a949bd15fbfab0cbshemminger
58311b41454dc445639924c691a949bd15fbfab0cbshemmingermatch:
59311b41454dc445639924c691a949bd15fbfab0cbshemminger	invert ATTRIBUTE '(' args ')'
60311b41454dc445639924c691a949bd15fbfab0cbshemminger		{
61311b41454dc445639924c691a949bd15fbfab0cbshemminger			$2->next = $4;
62311b41454dc445639924c691a949bd15fbfab0cbshemminger			$$ = new_ematch($2, $1);
63311b41454dc445639924c691a949bd15fbfab0cbshemminger			if ($$ == NULL)
64311b41454dc445639924c691a949bd15fbfab0cbshemminger				YYABORT;
65311b41454dc445639924c691a949bd15fbfab0cbshemminger		}
66311b41454dc445639924c691a949bd15fbfab0cbshemminger	| invert '(' expr ')'
67311b41454dc445639924c691a949bd15fbfab0cbshemminger		{
68311b41454dc445639924c691a949bd15fbfab0cbshemminger			$$ = new_ematch(NULL, $1);
69311b41454dc445639924c691a949bd15fbfab0cbshemminger			if ($$ == NULL)
70311b41454dc445639924c691a949bd15fbfab0cbshemminger				YYABORT;
71311b41454dc445639924c691a949bd15fbfab0cbshemminger			$$->child = $3;
72311b41454dc445639924c691a949bd15fbfab0cbshemminger		}
73311b41454dc445639924c691a949bd15fbfab0cbshemminger	;
74311b41454dc445639924c691a949bd15fbfab0cbshemminger
75311b41454dc445639924c691a949bd15fbfab0cbshemmingerargs:
76311b41454dc445639924c691a949bd15fbfab0cbshemminger	ATTRIBUTE
77311b41454dc445639924c691a949bd15fbfab0cbshemminger		{ $$ = $1; }
78311b41454dc445639924c691a949bd15fbfab0cbshemminger	| ATTRIBUTE args
79311b41454dc445639924c691a949bd15fbfab0cbshemminger		{ $1->next = $2; }
80311b41454dc445639924c691a949bd15fbfab0cbshemminger	;
81311b41454dc445639924c691a949bd15fbfab0cbshemminger
82311b41454dc445639924c691a949bd15fbfab0cbshemmingerrelation:
83311b41454dc445639924c691a949bd15fbfab0cbshemminger	AND
84311b41454dc445639924c691a949bd15fbfab0cbshemminger		{ $$ = TCF_EM_REL_AND; }
85311b41454dc445639924c691a949bd15fbfab0cbshemminger	| OR
86311b41454dc445639924c691a949bd15fbfab0cbshemminger		{ $$ = TCF_EM_REL_OR; }
87311b41454dc445639924c691a949bd15fbfab0cbshemminger	;
88311b41454dc445639924c691a949bd15fbfab0cbshemminger
89311b41454dc445639924c691a949bd15fbfab0cbshemmingerinvert:
90311b41454dc445639924c691a949bd15fbfab0cbshemminger	/* empty */
91311b41454dc445639924c691a949bd15fbfab0cbshemminger		{ $$ = 0; }
92311b41454dc445639924c691a949bd15fbfab0cbshemminger	| NOT
93311b41454dc445639924c691a949bd15fbfab0cbshemminger		{ $$ = 1; }
94311b41454dc445639924c691a949bd15fbfab0cbshemminger	;
95311b41454dc445639924c691a949bd15fbfab0cbshemminger%%
96311b41454dc445639924c691a949bd15fbfab0cbshemminger
975761f04fb8f47db22464ad420dd1a99ed842d569Stephen Hemminger void yyerror(const char *s)
98311b41454dc445639924c691a949bd15fbfab0cbshemminger {
99311b41454dc445639924c691a949bd15fbfab0cbshemminger	 ematch_err = strdup(s);
100311b41454dc445639924c691a949bd15fbfab0cbshemminger }
101