예제 #1
0
 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();
     }
 }
예제 #2
0
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
}
예제 #3
0
 EquelleType type() const
 {
     EquelleType lt = left_->type();
     return EquelleType(Bool, lt.compositeType(), lt.gridMapping());
 }