public void AddToken(FormulaTokenCode code, object[] data) { FormulaToken token = FormulaTokensFactory.CreateFromCode(this.worksheet, code); this.tokens.Add(token); token.DelayInitialize(data); }
public static byte[] ConvertNameRecordRangeToRpnBytes(ExcelWorksheet sheet, CellRange range, string sheetName, ExcelWorksheetCollection worksheets) { FormulaToken token = null; string str = string.Empty; if ((range.Width == 1) && (range.Height == 1)) { Match match = RefFormulaToken.IsCellRegex.Match(range.ToString()); string str2 = ConvertToAbsolute(match.Groups["Row"].Value); string str3 = ConvertToAbsolute(match.Groups["Column"].Value); str = sheetName + "!" + str3 + str2; token = new Ref3dFormulaToken(sheet, FormulaTokenCode.Ref3d1); } else { Match match2 = AreaFormulaToken.IsCellRangeRegex.Match(range.ToString()); string str4 = ConvertToAbsolute(match2.Groups["Row1"].Value); string str5 = ConvertToAbsolute(match2.Groups["Column1"].Value); string str6 = ConvertToAbsolute(match2.Groups["Row2"].Value); string str7 = ConvertToAbsolute(match2.Groups["Column2"].Value); str = sheetName + "!" + str5 + str4 + ":" + str7 + str6; token = new Area3dFormulaToken(FormulaTokenCode.Area3d1); } token.DelayInitialize(new object[] { str, worksheets }); return(token.ConvertToBytes()); }
private static void ProcessFunction(FormulaToken token, Stack operandsStack) { byte num = (token is FunctionFormulaToken) ? (token as FunctionFormulaToken).ArgumentsCount : (token as FunctionVarFormulaToken).ArgumentsCount; if (token is FunctionFormulaToken) { ushort code = (token as FunctionFormulaToken).Function.Code; } else { ushort num1 = (token as FunctionVarFormulaToken).Function.Code; } StringBuilder builder = new StringBuilder(); builder.Append(token.ToString()); builder.Append("("); string[] strArray = new string[num]; for (byte i = 0; i < num; i = (byte)(i + 1)) { strArray[i] = operandsStack.Pop() as string; } for (byte j = num; j > 0; j = (byte)(j - 1)) { string str = strArray[j - 1]; builder.Append(str); if (j != 1) { builder.Append(","); } } builder.Append(")"); operandsStack.Push(builder.ToString()); }
public static FormulaToken CreateFrom(ExcelWorksheet sheet, byte[] rpnBytes, int startIndex) { byte code = rpnBytes[startIndex]; FormulaToken token = CreateFromCode(sheet, code); token.Read(rpnBytes, startIndex + 1); return(token); }
private void TokensToString(Stack operandsStack, FormulaToken[] tokens) { for (int i = 0; i < tokens.Length; i++) { FormulaToken token = tokens[i]; ProcessToken(token, operandsStack); } }
private static void ProcessUnaryOperator(FormulaToken token, Stack operandsStack) { string str = operandsStack.Pop() as string; if (token.Code == 20) { operandsStack.Push(str + token.ToString()); } else if (token.Code == 21) { operandsStack.Push("(" + str + ")"); } else { operandsStack.Push(token.ToString() + str); } }
public static FormulaToken CreateFunctionFromName(string name, FormulaTokenClass tokenClass, byte argumentsCount) { FormulaToken token = null; if (FormulaFunctionsTable.Instance[name].IsFixedArgumentCount) { switch (tokenClass) { case FormulaTokenClass.Reference: token = new FunctionFormulaToken(FormulaTokenCode.Func1); break; case FormulaTokenClass.Variable: token = new FunctionFormulaToken(FormulaTokenCode.Func2); break; case FormulaTokenClass.Array: token = new FunctionFormulaToken(FormulaTokenCode.Func3); break; } } else { switch (tokenClass) { case FormulaTokenClass.Reference: token = new FunctionVarFormulaToken(FormulaTokenCode.FuncVar1); break; case FormulaTokenClass.Variable: token = new FunctionVarFormulaToken(FormulaTokenCode.FuncVar2); break; case FormulaTokenClass.Array: token = new FunctionVarFormulaToken(FormulaTokenCode.FuncVar3); break; } token.DelayInitialize(new object[] { name, argumentsCount }); return(token); } token.DelayInitialize(new object[] { name }); return(token); }
private static void ProcessToken(FormulaToken token, Stack operandsStack) { if (token.Type.IsUnary) { ProcessUnaryOperator(token, operandsStack); } else if (token.Type.IsBinary) { ProcessBinaryOperator(token, operandsStack); } else if (token.Type.IsOperand) { ProcessOperand(token, operandsStack); } else if (token.Type.IsFunction) { ProcessFunction(token, operandsStack); } else if (!token.Type.IsControl) { throw new ArgumentException("Invalid RPN token code."); } }
private bool TokenBytesToString(Stack operandsStack) { byte[] destinationArray = new byte[this.RpnBytes.Length]; Array.Copy(this.RpnBytes, 0, destinationArray, 0, this.RpnBytes.Length); int startIndex = 0; bool flag = false; bool flag2 = false; while (startIndex < this.RpnBytes.Length) { FormulaToken token = FormulaTokensFactory.CreateFrom(this.sheet, destinationArray, startIndex); if (token.Type.IsControl) { flag2 = true; } else { flag = true; } ProcessToken(token, operandsStack); startIndex += token.Size; } return(!flag && flag2); }
public void AddToken(FormulaToken token) { this.tokens.Add(token); }
private static void ProcessOperand(FormulaToken token, Stack operandsStack) { operandsStack.Push(token.ToString()); }
private static void ProcessBinaryOperator(FormulaToken token, Stack operandsStack) { operandsStack.Push((operandsStack.Pop() as string) + token.ToString() + (operandsStack.Pop() as string)); }