diff --git a/lib/cfg-grammar.y b/lib/cfg-grammar.y index 1cda9b21248..b7cd0ea885f 100644 --- a/lib/cfg-grammar.y +++ b/lib/cfg-grammar.y @@ -151,6 +151,16 @@ /* this is a placeholder for unit tests, must be the latest & largest */ %token LL_CONTEXT_MAX 23 +/* operators in the filter language, the order of this determines precedence */ +%right KW_ASSIGN 9000 +%left KW_OR 9001 +%left KW_AND 9002 +%left KW_STR_EQ 9003 KW_STR_NE 9004, KW_TA_EQ 9005, KW_TA_NE 9006, KW_TAV_EQ 9007, KW_TAV_NE 9008 +%left KW_STR_LT 9009, KW_STR_LE 9010, KW_STR_GE, 9011 KW_STR_GT, 9012, KW_TA_LT 9013, KW_TA_LE 9014, KW_TA_GE 9015, KW_TA_GT 9016 + +%left '+' '-' +%left '*' '/' +%left '.' KW_NOT 9017 /* statements */ %token KW_SOURCE 10000 diff --git a/lib/cfg-lex.l b/lib/cfg-lex.l index efa346e3eca..ba0d5791e9e 100644 --- a/lib/cfg-lex.l +++ b/lib/cfg-lex.l @@ -305,6 +305,15 @@ word [^ \#'"\(\)\{\}\[\]\\;\r\n\t,|\.@:] \.\. { return LL_DOTDOT; } \.\.\. { return LL_DOTDOTDOT; } => { return LL_ARROW; } +< { return KW_TA_LT; } +<= { return KW_TA_LE; } +== { return KW_TA_EQ; } +!= { return KW_TA_NE; } +>= { return KW_TA_GE; } +> { return KW_TA_GT; } +=== { return KW_TAV_EQ; } +!== { return KW_TAV_NE; } + (-|\+)?{digit}+\.{digit}+ { yylval->fnum = strtod(yytext, NULL); return LL_FLOAT; } 0x{xdigit}+ { if (!parse_int64_base16(yytext, &yylval->num)) diff --git a/lib/filter/filter-expr-grammar.ym b/lib/filter/filter-expr-grammar.ym index c46f3c6a590..2d1e55496e6 100644 --- a/lib/filter/filter-expr-grammar.ym +++ b/lib/filter/filter-expr-grammar.ym @@ -113,12 +113,6 @@ _translate_number_literals(CfgLexer *lexer, gint compare_mode, LogTemplate *expr %token KW_IN_LIST %left ';' -%left KW_OR -%left KW_AND -%left KW_NOT -%left KW_STR_LT KW_STR_LE KW_STR_EQ KW_STR_NE KW_STR_GE KW_STR_GT -%left KW_TA_LT KW_TA_LE KW_TA_EQ KW_TA_NE KW_TA_GE KW_TA_GT -%left KW_TAV_EQ KW_TAV_NE %type filter_expr %type filter_simple_expr diff --git a/lib/filter/filter-expr-parser.c b/lib/filter/filter-expr-parser.c index 442dc5e4ac8..59efbd8824d 100644 --- a/lib/filter/filter-expr-parser.c +++ b/lib/filter/filter-expr-parser.c @@ -41,18 +41,6 @@ static CfgLexerKeyword filter_expr_keywords[] = { "ge", KW_STR_GE }, { "gt", KW_STR_GT }, - /* type aware comparisons */ - { "<", KW_TA_LT }, - { "<=", KW_TA_LE }, - { "==", KW_TA_EQ }, - { "!=", KW_TA_NE }, - { ">=", KW_TA_GE }, - { ">", KW_TA_GT }, - - /* equal type and value */ - { "===", KW_TAV_EQ }, - { "!==", KW_TAV_NE }, - /* filter expressions */ { "severity", KW_SEVERITY }, { "level", KW_SEVERITY },