EquelleType type() const { EquelleType lt = left_->type(); EquelleType rt = right_->type(); switch (op_) { case Add: return lt; // should be identical to rt. case Subtract: return lt; // should be identical to rt. case Multiply: { const bool isvec = lt.basicType() == Vector || rt.basicType() == Vector; const BasicType bt = isvec ? Vector : Scalar; const bool coll = lt.isCollection() || rt.isCollection(); const bool sequence = lt.isSequence() || rt.isSequence(); const CompositeType ct = coll ? Collection : (sequence ? Sequence : None); const int gm = lt.isCollection() ? lt.gridMapping() : rt.gridMapping(); return EquelleType(bt, ct, gm); } case Divide: { const BasicType bt = lt.basicType(); const bool coll = lt.isCollection() || rt.isCollection(); const int gm = lt.isCollection() ? lt.gridMapping() : rt.gridMapping(); return EquelleType(bt, coll ? Collection : None, gm); } default: yyerror("internal compiler error in BinaryOpNode::type()."); return EquelleType(); } }
TypeNode* handleSequenceType(TypeNode* type_expr) { SequenceTypeNode* tn = new SequenceTypeNode(type_expr); tn->setLocation(FileLocation(yylineno)); return tn; #if 0 const EquelleType et = type_expr->type(); if (!et.isBasic()) { yyerror("cannot create a Sequence of non-basic types."); } TypeNode* node = new TypeNode(EquelleType(et.basicType(), Sequence, et.gridMapping(), et.subsetOf())); node->setLocation(FileLocation(yylineno)); return node; #endif }
EquelleType type() const { EquelleType lt = left_->type(); return EquelleType(Bool, lt.compositeType(), lt.gridMapping()); }