]> granicus.if.org Git - icinga2/commitdiff
Implement the __if and __else keywords
authorGunnar Beutner <gunnar.beutner@netways.de>
Mon, 24 Nov 2014 08:53:45 +0000 (09:53 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Mon, 24 Nov 2014 08:56:28 +0000 (09:56 +0100)
fixes #7824

lib/config/config_lexer.ll
lib/config/config_parser.yy
lib/config/expression.cpp
lib/config/expression.hpp

index 8b93df51aca2fa4d6a9d277ad7480f9f09af02ca..f24c8d22554c1c32c7a1cbbf80f5d5ffcb27d735 100644 (file)
@@ -251,6 +251,8 @@ __function                  return T_FUNCTION;
 __return                       return T_RETURN;
 __for                          return T_FOR;
 __signal                       return T_SIGNAL;
+__if                           return T_IF;
+__else                         return T_ELSE;
 =\>                            return T_FOLLOWS;
 \<\<                           return T_SHIFT_LEFT;
 \>\>                           return T_SHIFT_RIGHT;
index 92989ef26651616c6ee0cdd921e0f2aef229dadb..f38a255d9d4ab4fa1b9a4e72719bfca1b7edbf33 100644 (file)
@@ -165,6 +165,8 @@ static void MakeRBinaryOp(Expression** result, Expression *left, Expression *rig
 %token T_RETURN "return (T_RETURN)"
 %token T_FOR "for (T_FOR)"
 %token T_SIGNAL "signal (T_SIGNAL)"
+%token T_IF "if (T_IF)"
+%token T_ELSE "else (T_ELSE)"
 %token T_FOLLOWS "=> (T_FOLLOWS)"
 
 %type <text> identifier
@@ -855,6 +857,23 @@ rterm_without_indexer: T_STRING
                $$ = new ForExpression($3, "", $5, aexpr, DebugInfoRange(@1, @7));
                free($3);
        }
+       | T_IF '(' rterm ')' rterm_scope
+       {
+               DictExpression *atrue = dynamic_cast<DictExpression *>($5);
+               atrue->MakeInline();
+
+               $$ = new ConditionalExpression($3, atrue, NULL, DebugInfoRange(@1, @5));
+       }
+       | T_IF '(' rterm ')' rterm_scope T_ELSE rterm_scope
+       {
+               DictExpression *atrue = dynamic_cast<DictExpression *>($5);
+               atrue->MakeInline();
+
+               DictExpression *afalse = dynamic_cast<DictExpression *>($7);
+               afalse->MakeInline();
+
+               $$ = new ConditionalExpression($3, atrue, afalse, DebugInfoRange(@1, @7));
+       }
        ;
 
 target_type_specifier: /* empty */
index 063b922557fee884a2f666dedee83da90b315d04..bd5bb7852ae6e646bd5e8588a9a535ec09ff9cfc 100644 (file)
@@ -346,6 +346,14 @@ Value SetExpression::DoEvaluate(VMFrame& frame, DebugHint *dhint) const
        return right;
 }
 
+Value ConditionalExpression::DoEvaluate(VMFrame& frame, DebugHint *dhint) const
+{
+       if (m_Condition->Evaluate(frame, dhint))
+               return m_TrueBranch->Evaluate(frame, dhint);
+       else if (m_FalseBranch)
+               return m_FalseBranch->Evaluate(frame, dhint);
+}
+
 Value ReturnExpression::DoEvaluate(VMFrame& frame, DebugHint *dhint) const
 {
        BOOST_THROW_EXCEPTION(InterruptExecutionError(m_Operand->Evaluate(frame)));
index d9d9ca556314714d36c153409405387d593aae8f..73ea30f7b3e8b9a16769d4b17d3d09873a73790f 100644 (file)
@@ -556,6 +556,29 @@ private:
 
 };
 
+class I2_CONFIG_API ConditionalExpression : public DebuggableExpression
+{
+public:
+       ConditionalExpression(Expression *condition, Expression *true_branch, Expression *false_branch, const DebugInfo& debugInfo = DebugInfo())
+               : DebuggableExpression(debugInfo), m_Condition(condition), m_TrueBranch(true_branch), m_FalseBranch(false_branch)
+       { }
+
+       ~ConditionalExpression(void)
+       {
+               delete m_Condition;
+               delete m_TrueBranch;
+               delete m_FalseBranch; 
+       }
+
+protected:
+       virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
+
+private:
+       Expression *m_Condition;
+       Expression *m_TrueBranch;
+       Expression *m_FalseBranch;
+};
+
 class I2_CONFIG_API ReturnExpression : public UnaryExpression
 {
 public: