From 04b8724cb8d70d6c817373fcc6989545ad06f29b Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 18 Mar 2014 08:34:56 +0100 Subject: [PATCH] Implement == and != operators for AExpressions. Refs #5789 --- lib/config/aexpression.cpp | 4 ++++ lib/config/aexpression.h | 4 +++- lib/config/config_lexer.ll | 4 +++- lib/config/config_parser.yy | 20 +++++++++++++++++--- lib/config/expression.h | 4 +++- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/lib/config/aexpression.cpp b/lib/config/aexpression.cpp index 94aab4355..94922b694 100644 --- a/lib/config/aexpression.cpp +++ b/lib/config/aexpression.cpp @@ -65,6 +65,10 @@ Value AExpression::Evaluate(const Object::Ptr& thisRef) const return (long)left << (long)right; case AEShiftRight: return (long)left >> (long)right; + case AEEqual: + return left == right; + case AENotEqual: + return left != right; default: ASSERT(!"Invalid operator."); } diff --git a/lib/config/aexpression.h b/lib/config/aexpression.h index 34b827f98..a734c0ffb 100644 --- a/lib/config/aexpression.h +++ b/lib/config/aexpression.h @@ -41,7 +41,9 @@ enum AOperator AEBinaryAnd, AEBinaryOr, AEShiftLeft, - AEShiftRight + AEShiftRight, + AEEqual, + AENotEqual, }; /** diff --git a/lib/config/config_lexer.ll b/lib/config/config_lexer.ll index ce4bfa942..22da16575 100644 --- a/lib/config/config_lexer.ll +++ b/lib/config/config_lexer.ll @@ -232,7 +232,9 @@ const return T_CONST; -?[0-9]+(\.[0-9]+)?m { yylval->num = strtod(yytext, NULL) * 60; return T_NUMBER; } -?[0-9]+(\.[0-9]+)?s { yylval->num = strtod(yytext, NULL); return T_NUMBER; } -?[0-9]+(\.[0-9]+)? { yylval->num = strtod(yytext, NULL); return T_NUMBER; } -= { yylval->op = OperatorSet; return T_EQUAL; } +== { yylval->op = OperatorEqual; return T_EQUAL; } +!= { yylval->op = OperatorNotEqual; return T_NOT_EQUAL; } += { yylval->op = OperatorSet; return T_SET; } \+= { yylval->op = OperatorPlus; return T_PLUS_EQUAL; } -= { yylval->op = OperatorMinus; return T_MINUS_EQUAL; } \*= { yylval->op = OperatorMultiply; return T_MULTIPLY_EQUAL; } diff --git a/lib/config/config_parser.yy b/lib/config/config_parser.yy index 3a5209dec..bcdb20537 100644 --- a/lib/config/config_parser.yy +++ b/lib/config/config_parser.yy @@ -69,7 +69,9 @@ using namespace icinga; %token T_NUMBER %token T_NULL %token T_IDENTIFIER -%token T_EQUAL "= (T_EQUAL)" +%token T_EQUAL "== (T_EQUAL)" +%token T_NOT_EQUAL "!= (T_NOT_EQUAL)" +%token T_SET "= (T_SET)" %token T_PLUS_EQUAL "+= (T_PLUS_EQUAL)" %token T_MINUS_EQUAL "-= (T_MINUS_EQUAL)" %token T_MULTIPLY_EQUAL "*= (T_MULTIPLY_EQUAL)" @@ -191,7 +193,7 @@ library: T_LIBRARY T_STRING } ; -variable: variable_decl identifier T_EQUAL value +variable: variable_decl identifier T_SET value { Value *value = $4; if (value->IsObjectType()) { @@ -480,7 +482,7 @@ expression: identifier operator value } ; -operator: T_EQUAL +operator: T_SET | T_PLUS_EQUAL | T_MINUS_EQUAL | T_MULTIPLY_EQUAL @@ -591,6 +593,18 @@ aexpression: T_STRING $$ = new Value(make_shared(AENegate, static_cast(*$2))); delete $2; } + | aexpression T_EQUAL aexpression + { + $$ = new Value(make_shared(AEEqual, static_cast(*$1), static_cast(*$3))); + delete $1; + delete $3; + } + | aexpression T_NOT_EQUAL aexpression + { + $$ = new Value(make_shared(AENotEqual, static_cast(*$1), static_cast(*$3))); + delete $1; + delete $3; + } | aexpression '+' aexpression { $$ = new Value(make_shared(AEAdd, static_cast(*$1), static_cast(*$3))); diff --git a/lib/config/expression.h b/lib/config/expression.h index 1c0881019..4b77210a3 100644 --- a/lib/config/expression.h +++ b/lib/config/expression.h @@ -43,7 +43,9 @@ enum ExpressionOperator OperatorPlus, OperatorMinus, OperatorMultiply, - OperatorDivide + OperatorDivide, + OperatorEqual, /* Not used for Expressions */ + OperatorNotEqual, /* Not used for Expressions */ }; class ExpressionList;