#include <stdio.h>
#include <string.h>
+#include <pcre.h>
+
+#define OVECCOUNT 3
int yylex (void);
void yyerror (char const *);
}
%token <str> CONST
+%token <str> REGEX
%token <n> NUM
-%left EQ NEQ GE LE GT LT
+%left EQ NEQ GE LE GT LT RE NRE
%left '|' '&' '^'
%left '!'
%type <b> boo
boo: CONST EQ CONST { $$ = ! strcmp($1, $3); }
| CONST NEQ CONST { $$ = !! strcmp($1, $3); }
+ | CONST RE REGEX {
+ pcre *brum;
+ int erroroffset;
+ const char* error;
+ int ovector[OVECCOUNT];
+
+ brum=pcre_compile($3,0,&error,&erroroffset,NULL);
+ if (!brum){
+ puts("Mnau");
+ return 1;
+ }
+
+ int res=pcre_exec(brum,NULL,$1,strlen($1),0,0,ovector,OVECCOUNT);
+
+ $$ = res >= 0;
+ pcre_free(brum);
+ }
+ | CONST NRE REGEX {
+ pcre *brum;
+ int erroroffset;
+ const char* error;
+ int ovector[OVECCOUNT];
+
+ brum=pcre_compile($3,0,&error,&erroroffset,NULL);
+ if (!brum){
+ puts("Mnau");
+ return 1;
+ }
+
+ int res=pcre_exec(brum,NULL,$1,strlen($1),0,0,ovector,OVECCOUNT);
+
+ $$ = res < 0;
+ pcre_free(brum);
+ }
| NUM EQ NUM { $$ = $1 == $3 }
| NUM NEQ NUM { $$ = $1 != $3 }
| NUM GE NUM { $$ = $1 >= $3 }
exit(0);
}
while ((c = getchar()) != '"' || last == '\\'){
- yylval.str[i] = c;
+ if (last=='\\' && c != '"')
+ yylval.str[i-1] = c;
+ else {
+ yylval.str[i] = c;
+ i++;
+ }
last = c;
- i++;
if (i >= BUFSIZE-1)
break;
}
yylval.str[i] = '\0';
-
+
+ return CONST;
+ }
+
+ if (c == '\''){
+ last = '\'';
+ i = 0;
+ if (!(yylval.str = malloc(BUFSIZE))){
+ puts("Low memory");
+ exit(0);
+ }
+ while ((c = getchar()) != '\'' || last == '\\'){
+ if (last=='\\' && c != '\'')
+ yylval.str[i-1] = c;
+ else {
+ yylval.str[i] = c;
+ i++;
+ }
+ last = c;
+ if (i >= BUFSIZE-1)
+ break;
+ }
+ yylval.str[i] = '\0';
+
return CONST;
}
+ if (c == '/'){
+ last = '/';
+ i = 0;
+ if (!(yylval.str = malloc(BUFSIZE))){
+ puts("Low memory");
+ exit(0);
+ }
+ while ((c = getchar()) != '/' || last == '\\'){
+ if (last=='\\' && c != '/')
+ yylval.str[i-1] = c;
+ else {
+ yylval.str[i] = c;
+ i++;
+ }
+ last = c;
+ if (i >= BUFSIZE-1)
+ break;
+ }
+ yylval.str[i] = '\0';
+
+ return REGEX;
+ }
+
if (isdigit(c)){
ungetc(c,stdin);
scanf("%d",&yylval.n);
if (c == '!'){
if ((c = getchar ()) == '=')
return NEQ;
+ else if (c == '~')
+ return NRE;
+ else
+ ungetc(c,stdin);
}
if (c == '<'){
if (c == '='){
if ((c = getchar ()) == '=')
return EQ;
+ else
+ ungetc(c,stdin);
+ }
+
+ if (c == '~'){
+ if ((c = getchar ()) == '~')
+ return RE;
+ else
+ ungetc(c,stdin);
}
if (c == EOF)