const IRTree::IStm* CConditionalWrapper::andBinopToConditional( const IRTree::CBinop* binop, const Temp::CLabel* t, const Temp::CLabel* f ) const { Temp::CLabel* firstTrueLabel = new Temp::CLabel(); IRTree::CLabel* firstTrueIRLabel = new IRTree::CLabel( firstTrueLabel ); CConditionalWrapper leftWrapper( binop->left ); CConditionalWrapper rightWrapper( binop->right ); return new IRTree::CSeq( leftWrapper.ToConditional(firstTrueLabel, f), firstTrueIRLabel, rightWrapper.ToConditional( t, f ) ); }
IIRStm* CConditionalWrapper::andBinopToConditional( const CIRBinOp* binop, CLabel* t, CLabel* f ) const { CLabel* firstTrueLabel = new CLabel(); CIRLabel* firstTrueIRLabel = new CIRLabel( firstTrueLabel ); // –екурсивно смотрим аргументы CConditionalWrapper leftWrapper( binop->left ); CConditionalWrapper rightWrapper( binop->right ); return new CIRSeq( new CIRSeq( leftWrapper.ToConditional( firstTrueLabel, f ), firstTrueIRLabel), rightWrapper.ToConditional( t, f ) ); }