X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ffrontend%2Fgrammar.y;h=34a9c6b6474502d9fc059df45a6ed93a79890567;hb=a253fa4a57c8ac8abd2e0801d55f8556b87ef836;hp=26c8c1b046ddaa8df0af9c66dd2d2588a842a972;hpb=61bffa0a9775d926425c1a28bee49d341d1237b4;p=sysdb.git diff --git a/src/frontend/grammar.y b/src/frontend/grammar.y index 26c8c1b..34a9c6b 100644 --- a/src/frontend/grammar.y +++ b/src/frontend/grammar.y @@ -66,8 +66,11 @@ sdb_fe_yyerror(YYLTYPE *lval, sdb_fe_yyscan_t scanner, const char *msg); %name-prefix "sdb_fe_yy" %union { + const char *sstr; /* static string */ char *str; + sdb_data_t data; + sdb_llist_t *list; sdb_conn_node_t *node; @@ -80,16 +83,20 @@ sdb_fe_yyerror(YYLTYPE *lval, sdb_fe_yyscan_t scanner, const char *msg); %token AND OR NOT WHERE %token CMP_EQUAL CMP_NEQUAL CMP_REGEX CMP_NREGEX +%token CMP_LT CMP_LE CMP_GE CMP_GT %token FETCH LIST LOOKUP %token IDENTIFIER STRING +%token INTEGER FLOAT + /* Precedence (lowest first): */ %left OR %left AND -%left NOT +%right NOT %left CMP_EQUAL CMP_NEQUAL +%left CMP_LT CMP_LE CMP_GE CMP_GT %left CMP_REGEX CMP_NREGEX %left '(' ')' %left '.' @@ -104,6 +111,13 @@ sdb_fe_yyerror(YYLTYPE *lval, sdb_fe_yyscan_t scanner, const char *msg); %type matcher compare_matcher +%type op + +%type data + +%destructor { free($$); } +%destructor { sdb_object_deref(SDB_OBJ($$)); } + %% statements: @@ -284,44 +298,42 @@ matcher: * Parse matchers comparing object attributes with a value. */ compare_matcher: - IDENTIFIER '.' IDENTIFIER CMP_EQUAL STRING + IDENTIFIER '.' IDENTIFIER op data { - $$ = sdb_store_matcher_parse_cmp($1, $3, "=", $5); - /* TODO: simplify memory management in the parser */ + $$ = sdb_store_matcher_parse_cmp($1, $3, $4, &$5); free($1); $1 = NULL; free($3); $3 = NULL; - free($5); $5 = NULL; + sdb_data_free_datum(&$5); } + ; + +op: + CMP_EQUAL { $$ = "="; } | - IDENTIFIER '.' IDENTIFIER CMP_NEQUAL STRING - { - $$ = sdb_store_matcher_parse_cmp($1, $3, "!=", $5); - /* TODO: simplify memory management in the parser */ - free($1); $1 = NULL; - free($3); $3 = NULL; - free($5); $5 = NULL; - } + CMP_NEQUAL { $$ = "!="; } | - IDENTIFIER '.' IDENTIFIER CMP_REGEX STRING - { - $$ = sdb_store_matcher_parse_cmp($1, $3, "=~", $5); - free($1); $1 = NULL; - free($3); $3 = NULL; - free($5); $5 = NULL; - } + CMP_REGEX { $$ = "=~"; } | - IDENTIFIER '.' IDENTIFIER CMP_NREGEX STRING - { - $$ = sdb_store_matcher_parse_cmp($1, $3, "!~", $5); - free($1); $1 = NULL; - free($3); $3 = NULL; - free($5); $5 = NULL; - } + CMP_NREGEX { $$ = "!~"; } + | + CMP_LT { $$ = "<"; } + | + CMP_LE { $$ = "<="; } + | + CMP_GE { $$ = ">="; } + | + CMP_GT { $$ = ">"; } ; -%% +data: + STRING { $$.type = SDB_TYPE_STRING; $$.data.string = $1; } + | + INTEGER { $$ = $1; } + | + FLOAT { $$ = $1; } + ; -/* XXX: on parse errors, allocated objects, strings, etc. need to be freed */ +%% void sdb_fe_yyerror(YYLTYPE *lval, sdb_fe_yyscan_t scanner, const char *msg)