public FunctionExpression(FunctionOperation operation, IExpression parameter) { if (parameter == null) { throw new ArgumentNullException("parameter"); } Operation = operation; Parameter = parameter; }
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); }
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}"); }
/// <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)))); }
public FunctionEvaluation(FunctionOperation function, Evaluation argument) { this.function = function; this.argument = argument; }
internal ArangoFunctionOperation(FunctionOperation functionOperation) { _functionOperation = functionOperation; }