__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;
%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
$$ = 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 */
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)));
};
+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: