コード例 #1
0
        public ISymbolValue Visit(IdentifierExpression id)
        {
            var ImplicitlyExecute = this.ImplicitlyExecute;

            this.ImplicitlyExecute = true;

            if (id.IsIdentifier)
            {
                var o = ExpressionTypeEvaluation.EvaluateTypes(id, ctxt);

                if (o == null || o.Length == 0)
                {
                    EvalError(id, "Symbol could not be found");
                    return(null);
                }

                return(TryDoCTFEOrGetValueRefs(o, id, ImplicitlyExecute));
            }

            byte tt;

            switch (id.Format)
            {
            case Parser.LiteralFormat.CharLiteral:
                var tk = id.Subformat == LiteralSubformat.Utf32 ? DTokens.Dchar :
                         id.Subformat == LiteralSubformat.Utf16 ? DTokens.Wchar :
                         DTokens.Char;

                return(new PrimitiveValue(tk, Convert.ToDecimal((int)(char)id.Value), id));

            case LiteralFormat.FloatingPoint | LiteralFormat.Scalar:
                var im = id.Subformat.HasFlag(LiteralSubformat.Imaginary);

                tt = im ? DTokens.Idouble : DTokens.Double;

                if (id.Subformat.HasFlag(LiteralSubformat.Float))
                {
                    tt = im ? DTokens.Ifloat : DTokens.Float;
                }
                else if (id.Subformat.HasFlag(LiteralSubformat.Real))
                {
                    tt = im ? DTokens.Ireal : DTokens.Real;
                }

                var v = Convert.ToDecimal(id.Value);

                return(new PrimitiveValue(tt, im ? 0 : v, id, im ? v : 0));

            case LiteralFormat.Scalar:
                var unsigned = id.Subformat.HasFlag(LiteralSubformat.Unsigned);

                if (id.Subformat.HasFlag(LiteralSubformat.Long))
                {
                    tt = unsigned ? DTokens.Ulong : DTokens.Long;
                }
                else
                {
                    tt = unsigned ? DTokens.Uint : DTokens.Int;
                }

                return(new PrimitiveValue(tt, Convert.ToDecimal(id.Value), id));

            case Parser.LiteralFormat.StringLiteral:
            case Parser.LiteralFormat.VerbatimStringLiteral:
                return(new ArrayValue(GetStringType(id.Subformat), id));

            default:
                return(null);
            }
        }
コード例 #2
0
 public ISymbolValue Visit(NewExpression nex)
 {
     //TODO: Create virtual object and call the appropriate ctor, then return the object
     return(TryDoCTFEOrGetValueRefs(ExpressionTypeEvaluation.EvaluateTypes(nex, ctxt), nex));
 }