10 void yyerror (char const *);
12 int regex_cmp(char* s, char* r);
27 %token KW_IF KW_ELSE KW_PIPE KW_MAIL KW_COPY
28 %token '(' ')' '{' '}'
30 %left EQ NEQ GE LE '<' '>' RE NRE
44 | boo '\n' { printf("%s\n",$1?"true":"false"); }
45 | error '\n' { yyerrok; }
48 boo: CONST EQ CONST { $$ = ! strcmp($1, $3); }
49 | CONST NEQ CONST { $$ = !! strcmp($1, $3); }
50 | CONST RE REGEX { $$ = regex_cmp($1,$3) >= 0 }
51 | CONST NRE REGEX { $$ = regex_cmp($1,$3) < 0 }
52 | NUM EQ NUM { $$ = $1 == $3 }
53 | NUM NEQ NUM { $$ = $1 != $3 }
54 | NUM GE NUM { $$ = $1 >= $3 }
55 | NUM LE NUM { $$ = $1 <= $3 }
56 | NUM '>' NUM { $$ = $1 > $3 }
57 | NUM '<' NUM { $$ = $1 < $3 }
58 | boo '|' boo { $$ = $1 || $3 }
59 | boo '&' boo { $$ = $1 && $3 }
60 | boo '^' boo { $$ = ($1 || $3) && !($1 && $3) }
61 | '!' boo { $$ = ! $2 }
73 regex_cmp(char* s, char* r)
78 int ovector[OVECCOUNT];
80 brum=pcre_compile(r,0,&error,&erroroffset,NULL);
84 int res=pcre_exec(brum,NULL,s,strlen(s),0,0,ovector,OVECCOUNT);
92 get_string_out(char delim)
99 if (!(s = malloc(BUFSIZE))){
104 while ((c = getchar()) != delim || last == '\\'){
105 if (last=='\\' && c != delim)
136 while ((c = getchar ()) == ' ' || c == '\t');
140 yylval.str = get_string_out('"');
146 yylval.str = get_string_out('\'');
152 yylval.str = get_string_out('/');
158 scanf("%d",&yylval.n);
163 if ((c = getchar ()) == '=')
174 if ((c = getchar ()) == '=')
183 if ((c = getchar ()) == '=')
192 if ((c = getchar ()) == '=')
201 if ((c = getchar ()) == '~')
210 if ((c = getchar ()) == '>')
221 if (!(yylval.str=malloc(BUFSIZE))){
226 while (isalnum(c = getchar()) || c == '_' || c == '-'){
236 if (c == '\n' || c == '+' || c == '*' || c == '/' ||
237 c == '(' || c == ')' || c == '{' || c == '}')
247 while (isalpha(c = getchar()) && i<KLEN-1)
251 if (!strcmp(buf,"if"))
253 else if (!strcmp(buf,"else"))
255 else if (!strcmp(buf,"pipe"))
257 else if (!strcmp(buf,"mail"))
259 else if (!strcmp(buf,"copy"))
272 yyerror (char const *s)
274 fprintf (stderr, "%s\n", s);