Пример #1
0
        public ILanguageType VerifyType_SymbolicExpression(MathematicaScalar sc, OperandsByName operands)
        {
            var s = new StringBuilder();

            var varTypes = new Dictionary <string, MathematicaAtomicType>();

            foreach (var pair in operands.OperandsDictionary)
            {
                //var lhs_type = this.GMacSymbolTable.Scalar
                var rhsType = pair.Value.ExpressionType;

                if (rhsType.IsBoolean())
                {
                    varTypes.Add(pair.Key, MathematicaAtomicType.Boolean);
                }

                if (rhsType.IsInteger())
                {
                    varTypes.Add(pair.Key, MathematicaAtomicType.Integer);
                }

                if (rhsType.IsScalar())
                {
                    varTypes.Add(pair.Key, MathematicaAtomicType.Real);
                }

                else
                {
                    s.Append("cannot assign RHS expression of type ");
                    s.Append(rhsType.TypeSignature);
                    s.Append(" to symbolic expression parameter ");
                    s.Append(pair.Key);
                }
            }

            if (s.Length > 0)
            {
                return(Context.CreateTypeMismatch(s.ToString()));
            }

            var assumeExpr = Cas.CreateAssumeExpr(varTypes);

            if (sc.IsBooleanScalar(assumeExpr))
            {
                return(GMacRootAst.BooleanType);
            }

            //if (sc.IsIntegerScalar(assumeExpr))
            //    return GMacRootAst.IntegerType;

            if (sc.IsRealScalar(assumeExpr))
            {
                return(GMacRootAst.ScalarType);
            }

            return
                (sc.IsComplexScalar(assumeExpr)
                ? GMacRootAst.ScalarType
                : Context.CreateTypeMismatch("Symbolic expression type cannot be determined"));
        }