diff --git a/src/frontend/grammar.y b/src/frontend/grammar.y
index 6c52b74907b17163d1c15c7890f9f85d0ed959bf..fd268baf3a9c6ce5126891c9ff6edbcc8af16e4f 100644 (file)
--- a/src/frontend/grammar.y
+++ b/src/frontend/grammar.y
%token SCANNER_ERROR
-%token WHERE
+%token AND OR WHERE
%token CMP_EQUAL CMP_REGEX
%token <str> IDENTIFIER STRING
%token <node> FETCH LIST LOOKUP
+/* Precedence (lowest first): */
+%left OR
+%left AND
+%left CMP_EQUAL
+%left CMP_REGEX
+
%type <list> statements
%type <node> statement
fetch_statement
lookup_statement
expression
-%type <m> compare_matcher
+%type <m> matcher
+ compare_matcher
%%
;
expression:
- compare_matcher
+ matcher
{
sdb_store_matcher_t *m = $1;
if (! m) {
conn_node_matcher_t));
$$->cmd = CONNECTION_EXPR;
- if (M(m)->type == MATCHER_HOST)
+ if ((M(m)->type == MATCHER_HOST)
+ || (M(m)->type == MATCHER_AND)
+ || (M(m)->type == MATCHER_OR))
CONN_MATCHER($$)->matcher = m;
else if (M(m)->type == MATCHER_SERVICE)
CONN_MATCHER($$)->matcher = sdb_store_host_matcher(NULL,
CONN_MATCHER($$)->matcher = sdb_store_host_matcher(NULL,
/* name_re = */ NULL, /* service = */ NULL,
/* attr = */ m);
+ else {
+ char errbuf[1024];
+ snprintf(errbuf, sizeof(errbuf),
+ YY_("syntax error, unexpected matcher type %d"),
+ M(m)->type);
+ sdb_fe_yyerror(&yylloc, scanner, errbuf);
+ YYABORT;
+ }
+ }
+ ;
+
+matcher:
+ matcher AND matcher
+ {
+ $$ = sdb_store_con_matcher($1, $3);
+ }
+ |
+ matcher OR matcher
+ {
+ $$ = sdb_store_dis_matcher($1, $3);
+ }
+ |
+ compare_matcher
+ {
+ $$ = $1;
}
;