Esempio n. 1
0
        public static object op_dif(Tokenizer tok, Context.Entry e, object scope)
        {
            object left, right; Type lType, rType;

            op_BinaryArgs(tok, e, scope, out left, out right, out lType, out rType);
            do
            {
                if (lType == typeof(string) || rType == typeof(string))
                {
                    break;
                }
                if (CodeConvert.IsConvertable(lType) && CodeConvert.IsConvertable(rType))
                {
                    CodeConvert.TryConvert(ref left, typeof(double));
                    CodeConvert.TryConvert(ref right, typeof(double));
                    return(((double)left) - ((double)right));
                }
            } while (false);
            tok.AddError(e.tokens[1], "unable to subtract " + lType + " and " + rType + " : " + left + " - " + right);
            return(e);
        }
Esempio n. 2
0
        public static object op_mod(Tokenizer tok, Context.Entry e, object scope)
        {
            object left, right; Type lType, rType;

            op_BinaryArgs(tok, e, scope, out left, out right, out lType, out rType);
            do
            {
                if (lType == typeof(string))
                {
                    string        format = left as string;
                    List <object> args;
                    if (rType != typeof(List <object>))
                    {
                        args = new List <object>();
                        args.Add(right);
                    }
                    else
                    {
                        args = right as List <object>;
                    }
                    return(Format(format, args, scope, tok, e.tokens[0].index));
                }
                if (lType == typeof(string) || rType == typeof(string))
                {
                    break;
                }
                if (CodeConvert.IsConvertable(lType) && CodeConvert.IsConvertable(rType))
                {
                    CodeConvert.TryConvert(ref left, typeof(double));
                    CodeConvert.TryConvert(ref right, typeof(double));
                    return(((double)left) % ((double)right));
                }
            } while (false);
            tok.AddError(e.tokens[1], "unable to modulo " + lType + " and " + rType + " : " + left + " % " + right);
            return(e);
        }
Esempio n. 3
0
        bool AddArg(Argument arg, ref int i, List <Token> tokens, Tokenizer tokenizer, object scriptVariables)
        {
            if (arg.flag)
            {
                namedValues[arg.id] = true;
                return(true);
            }
            if (++i >= tokens.Count)
            {
                return(false);
            }
            Token tValue = tokens[i];

            CodeConvert.TryParse(tokens[i], out object result, scriptVariables, tokenizer);
            Type type = arg.valueType;
            //Show.Log(resultType + " : " + result.StringifySmall());
            bool goodArgument = false;

            if (result != null)
            {
                if (!(goodArgument = result.GetType() == type))
                {
                    goodArgument = CodeConvert.TryConvert(ref result, type);
                }
                if (goodArgument)
                {
                    namedValues[arg.id] = result;
                }
            }
            if (!goodArgument)
            {
                tokenizer.AddError(tValue.index, "Could not cast (" + type.Name + ") from (" +
                                   (result?.GetType().ToString() ?? "null") + ")");
            }
            return(goodArgument);
        }
Esempio n. 4
0
        protected bool TryGetValue()
        {
            memberValue = null;
            Token  token = Current.Token;
            object meta  = token.meta;

            if (SkipStructuredDelimiters(meta as Delim))
            {
                return(true);
            }
            Context.Entry context = meta as Context.Entry;
            if (context != null)
            {
                bool subContextUsingSameList = context.tokens == Current.tokens;
                if (context.IsText())
                {
                    memberValue = context.GetText();
                }
                else
                {
                    int          index     = Current.tokenIndex;
                    List <Token> parseNext = subContextUsingSameList
                                                        ? Current.tokens.GetRange(index, context.tokenCount)
                                                        : context.tokens;
                    if (memberType == typeof(Expression))
                    {
                        memberValue = new Expression(new List <Token>()
                        {
                            token
                        });
                    }
                    else
                    {
                        if (CodeConvert.IsConvertable(memberType))
                        {
                            //Show.Log(memberId + " :: " + memberValue);
                            memberValue = context.Resolve(tok, scope);
                        }
                        else
                        {
                            //Show.Log(memberId+" : "+memberValue);
                            if (!CodeConvert.TryParseTokens(memberType, parseNext, ref memberValue, scope, tok))
                            {
                                return(false);
                            }
                        }
                    }
                }
                if (subContextUsingSameList)
                {
                    Current.tokenIndex += context.tokenCount - 1;                     // -1 because increment happens after this method
                }
                return(true);
            }
            string s = meta as string;

            if (s != null)
            {
                memberValue = token.ToString(s);
                if (!CodeConvert.TryConvert(ref memberValue, memberType))
                {
                    AddError("unable to convert (" + memberValue + ") to type '" + memberType + "'");
                    return(false);
                }
                return(true);
            }
            TokenSubstitution sub = meta as TokenSubstitution;

            if (sub != null)
            {
                memberValue = sub.value;
                if (!memberType.IsAssignableFrom(memberValue.GetType()) && !CodeConvert.TryConvert(ref memberValue, memberType))
                {
                    AddError("unable to convert substitution (" + memberValue + ") to type '" + memberType + "'");
                    return(false);
                }
                return(true);
            }
            AddError("unable to parse token with meta data " + meta);
            return(false);
        }
Esempio n. 5
0
 private bool TryGetValue_String(Token token)
 {
     //memberValue = token.ToString(s);
     CodeRules.op_ResolveToken(tok, token, scope, out memberValue, out Type _memberType);
     if (memberType == null || memberValue == null || (!memberType.IsAssignableFrom(memberValue.GetType()) && !CodeConvert.TryConvert(ref memberValue, memberType)))
     {
         AddError("unable to convert (" + memberValue + ") to type '" + memberType + "'");
         return(false);
     }
     return(true);
 }