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