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