コード例 #1
0
        public FunctionExpression(FunctionOperation operation, IExpression parameter)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException("parameter");
            }

            Operation = operation;
            Parameter = parameter;
        }
コード例 #2
0
        private bool IsFunctionName(Token token, out FunctionOperation operation)
        {
            switch (token.Value)
            {
            case "Exists":
                operation = FunctionOperation.Exists;
                return(true);

            case "HasTrailingSlash":
                operation = FunctionOperation.HasTrailingSlash;
                return(true);
            }

            operation = (FunctionOperation)(-1);
            return(false);
        }
コード例 #3
0
        private Evaluation PerformEvaluate(ParseTreeNode node)
        {
            switch (node.Term.Name)
            {
            case "BinExpr":
                var             leftNode      = node.ChildNodes[0];
                var             operationNode = node.ChildNodes[1];
                var             rightNode     = node.ChildNodes[2];
                Evaluation      left          = PerformEvaluate(leftNode);
                Evaluation      right         = PerformEvaluate(rightNode);
                BinaryOperation operation     = BinaryOperation.Add;
                switch (operationNode.Term.Name)
                {
                case "+":
                    operation = BinaryOperation.Add;
                    break;

                case "-":
                    operation = BinaryOperation.Sub;
                    break;

                case "*":
                    operation = BinaryOperation.Mul;
                    break;

                case "/":
                    operation = BinaryOperation.Div;
                    break;

                case "^":
                    operation = BinaryOperation.Exp;
                    break;
                }
                return(new BinaryEvaluation(left, right, operation));

            case "FunctionCall":
                var               functionNode = node.ChildNodes[0];
                var               argumentNode = node.ChildNodes[1];
                Evaluation        argument     = PerformEvaluate(argumentNode);
                FunctionOperation function     = FunctionOperation.sin;
                switch (functionNode.Token.Text)
                {
                case "sin":
                    function = FunctionOperation.sin;
                    break;

                case "cos":
                    function = FunctionOperation.cos;
                    break;

                case "tg":
                    function = FunctionOperation.tg;
                    break;

                case "ctg":
                    function = FunctionOperation.ctg;
                    break;
                }
                return(new FunctionEvaluation(function, argument));

            case "number":
                CultureInfo culture = new CultureInfo("en-US");
                var         value   = Convert.ToSingle(node.Token.Text, culture);
                return(new ConstantEvaluation(value));

            case "AssignmentStmt":
                var        expNode    = node.ChildNodes[0];
                var        expreNode  = node.ChildNodes[2];
                Evaluation expression = PerformEvaluate(expreNode);
                return(new NameEvaluation(expNode.ToString(), expression));

            case "Term":
                Console.WriteLine("не знаю что с этим делать");
                throw new NotSupportedException();

            case "UnExpr":
                var        unNode       = node.ChildNodes[0];
                var        unExprNode   = node.ChildNodes[1];
                Evaluation unExpression = PerformEvaluate(unExprNode);
                return(new UnaryEvaluation(unNode.ToString(), unExpression));
            }

            throw new InvalidOperationException($"Unrecognizable term {node.Term.Name}");
        }
コード例 #4
0
ファイル: PyInterpreter.cs プロジェクト: benamehdi7/tesv-snip
        /// <summary>
        /// Execute a script function
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="elemt"></param>
        /// <param name="value"></param>
        /// <param name="funcOp"></param>
        /// <returns></returns>
        public static T ExecuteFunction <T>(ElementStructure elemt, object value, FunctionOperation funcOp) where T : struct
        {
            if (funcOp == FunctionOperation.ForReading)
            {
                if (string.IsNullOrWhiteSpace(elemt.funcr))
                {
                    var changeType = Convert.ChangeType(value, Type.GetTypeCode(typeof(T)));
                    if (changeType != null)
                    {
                        return((T)changeType);
                    }
                }
            }

            if (funcOp == FunctionOperation.ForWriting)
            {
                if (string.IsNullOrWhiteSpace(elemt.funcw))
                {
                    var type = Convert.ChangeType(value, Type.GetTypeCode(typeof(T)));
                    if (type != null)
                    {
                        return((T)type);
                    }
                }
            }

            switch (elemt.type)
            {
            case ElementValueType.Float:
            case ElementValueType.Int:
            case ElementValueType.Short:
            case ElementValueType.UInt:
            case ElementValueType.UShort:
                break;

            default:
                var changeType = Convert.ChangeType(value, Type.GetTypeCode(typeof(T)));
                if (changeType != null)
                {
                    return((T)changeType);
                }
                break;
            }

            // Parse function name ElementValueType
            string func = elemt.funcr;

            if (funcOp == FunctionOperation.ForWriting)
            {
                func = elemt.funcw;
            }
            string[] s1       = func.Split('(');
            string   funcName = s1[0];

            PyFunctionDefinition pyFunc;

            if (!_pyDictionary.TryGetValue(funcName, out pyFunc))
            {
                string msg = "ExecuteWritingFunction: The '" + funcName + "' function doesn't exist !!!";
                MessageBox.Show(msg, @"TESSnip Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                var changeType = Convert.ChangeType(value, Type.GetTypeCode(typeof(T)));
                if (changeType != null)
                {
                    return((T)changeType);
                }
            }

            object function = _objOps.GetMember(_snipClassObj, funcName); // get function

            // Parse parameters
            string p     = s1[1].Replace("(", "").Replace(")", "").Trim();
            var    param = new object[0];

            if (!string.IsNullOrWhiteSpace(p))
            {
                string[] parameters = p.Split(',');
                param = new object[parameters.Length];
                for (int i = 0; i < parameters.Length; i++)
                {
                    // management of the decimal separator
                    parameters[i] = parameters[i].Trim();
                    parameters[i] = parameters[i].Replace(".", _ni.CurrencyDecimalSeparator);
                    parameters[i] = parameters[i].Replace(",", _ni.CurrencyDecimalSeparator);
                }

                try
                {
                    for (int i = 0; i < parameters.Length; i++)
                    {
                        if (pyFunc != null)
                        {
                            switch (pyFunc.Parameters[i + 3]) //+2 jump self, element and value parameter
                            {
                            case "float":
                                param[i] = float.Parse(parameters[i], _ni);
                                break;

                            case "int":
                                param[i] = int.Parse(parameters[i], _ni);
                                break;

                            case "short":
                                param[i] = short.Parse(parameters[i], _ni);
                                break;

                            case "uint":
                                param[i] = uint.Parse(parameters[i], _ni);
                                break;

                            case "ushort":
                                param[i] = ushort.Parse(parameters[i], _ni);
                                break;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(string.Format(@"ExecuteWritingFunction: {0}", ex.Message), @"TESSnip Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    throw;
                }
            }

            var result = value;

            try
            {
                var el = new PyElement
                {
                    Name       = elemt.name,
                    Desc       = elemt.desc,
                    CondId     = elemt.CondID,
                    FormIdType = elemt.FormIDType,
                    Flags      = elemt.flags,
                    Group      = elemt.@group,
                    Multiline  = elemt.multiline,
                    NotInInfo  = elemt.notininfo,
                    Optional   = elemt.optional,
                    Options    = elemt.options,
                    Repeat     = elemt.repeat,
                    FuncRead   = elemt.funcr,
                    FuncWrite  = elemt.funcw,
                    ValueType  = elemt.type
                };

                switch (elemt.type)
                {
                case ElementValueType.Float:
                    result = _objOps.Invoke(function, el, (float)value, param);
                    break;

                case ElementValueType.Int:
                    result = _objOps.Invoke(function, el, (int)value, param);
                    break;

                case ElementValueType.Short:
                    result = _objOps.Invoke(function, el, (short)value, param);
                    break;

                case ElementValueType.UInt:
                    result = _objOps.Invoke(function, el, (uint)value, param);
                    break;

                case ElementValueType.UShort:
                    result = _objOps.Invoke(function, el, (ushort)value, param);
                    break;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("ExecuteWritingFunction: {0}", ex.Message), @"TESSnip Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                throw;
            }

            return((T)Convert.ChangeType(result, Type.GetTypeCode(typeof(T))));
        }
コード例 #5
0
 public FunctionEvaluation(FunctionOperation function, Evaluation argument)
 {
     this.function = function;
     this.argument = argument;
 }
コード例 #6
0
 internal ArangoFunctionOperation(FunctionOperation functionOperation)
 {
     _functionOperation = functionOperation;
 }