X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ffrontend%2Fgrammar.y;h=ef479efc336ba30e90182ae72557c0892091fc07;hb=d8dafe689b17088740721432558b00d12482c583;hp=08f8414142f58123dd63c9cf7c991d96c6bff5ff;hpb=f5f3eb3a9bdc2e0e4efae16a761453e44f35e646;p=sysdb.git diff --git a/src/frontend/grammar.y b/src/frontend/grammar.y index 08f8414..ef479ef 100644 --- a/src/frontend/grammar.y +++ b/src/frontend/grammar.y @@ -132,7 +132,7 @@ sdb_fe_yyerror(YYLTYPE *lval, sdb_fe_yyscan_t scanner, const char *msg); %type expression -%type op +%type cmp %type data interval interval_elem @@ -355,7 +355,7 @@ condition: $$ = SDB_CONN_NODE(sdb_object_create_dT(/* name = */ NULL, conn_matcher_t, conn_matcher_destroy)); - $$->cmd = CONNECTION_EXPR; + $$->cmd = CONNECTION_MATCHER; CONN_MATCHER($$)->matcher = $1; } ; @@ -393,26 +393,26 @@ matcher: ; /* - * . + * . * * Parse matchers comparing object attributes with a value. */ compare_matcher: - ':' IDENTIFIER op expression + '.' IDENTIFIER cmp expression { $$ = sdb_store_matcher_parse_field_cmp($2, $3, $4); free($2); $2 = NULL; sdb_object_deref(SDB_OBJ($4)); } | - IDENTIFIER op expression + IDENTIFIER cmp expression { $$ = sdb_store_matcher_parse_cmp($1, NULL, $2, $3); free($1); $1 = NULL; sdb_object_deref(SDB_OBJ($3)); } | - IDENTIFIER '[' IDENTIFIER ']' op expression + IDENTIFIER '[' IDENTIFIER ']' cmp expression { $$ = sdb_store_matcher_parse_cmp($1, $3, $5, $6); free($1); $1 = NULL; @@ -481,13 +481,27 @@ expression: sdb_object_deref(SDB_OBJ($3)); $3 = NULL; } | - ':' IDENTIFIER + expression CONCAT expression + { + $$ = sdb_store_expr_create(SDB_DATA_CONCAT, $1, $3); + sdb_object_deref(SDB_OBJ($1)); $1 = NULL; + sdb_object_deref(SDB_OBJ($3)); $3 = NULL; + } + | + '.' IDENTIFIER { int field = sdb_store_parse_field_name($2); free($2); $2 = NULL; $$ = sdb_store_expr_fieldvalue(field); } | + IDENTIFIER '[' IDENTIFIER ']' + { + $$ = sdb_store_expr_attrvalue($3); + free($1); $1 = NULL; + free($3); $3 = NULL; + } + | data { $$ = sdb_store_expr_constvalue(&$1); @@ -495,7 +509,7 @@ expression: } ; -op: +cmp: CMP_EQUAL { $$ = "="; } | CMP_NEQUAL { $$ = "!="; }