Beispiel #1
0
        public virtual void Parse()
        {
            LastRefOp          = -1;
            FHasErrors         = false;
            FParsedDataBuilder = new TParsedTokenListBuilder();
            try
            {
                Go();
                FParsedData            = FParsedDataBuilder.ToParsedTokenList();
                FParsedData.TextLenght = FormulaText.Length;
            }
            finally
            {
                FParsedDataBuilder = null;
            }

            //Try to decode what we encoded
            //something like "= >" will be encoded nicely, but will crash when decoded

            /*try
             * {
             *      FParsedData.ResetPositionToLast();
             *      FParsedData.Flush();
             *      if (!FParsedData.Bof())FlxMessages.ThrowException(FlxErr.ErrFormulaInvalid, FormulaText);
             * }
             * catch (Exception)
             * {
             *      FlxMessages.ThrowException(FlxErr.ErrFormulaInvalid,FormulaText);
             * }*/
        }
Beispiel #2
0
        public TParsedTokenList ParseRPN(TNameRecordList Names, int aRow, int aCol, byte[] Data, int atPos, int fmlaLen, bool aRelative3dRanges, out bool HasSubtotal, out bool HasAggregate, bool aIsFmlaObject)
        {
            HasSubtotal      = false;
            HasAggregate     = false;
            Relative3dRanges = aRelative3dRanges;
            IsFmlaObject     = aIsFmlaObject;
            TParsedTokenListBuilder TokenBuilder = new TParsedTokenListBuilder();

            if (!DoRPN(TokenBuilder, Names, Data, atPos, atPos + fmlaLen, ref HasSubtotal, ref HasAggregate))
            {
                XlsMessages.ThrowException(XlsErr.ErrBadFormula, aRow + 1, aCol + 1, 0);
            }
            return(TokenBuilder.ToParsedTokenList());
        }
Beispiel #3
0
        private void CheckFutureFunction(TParsedTokenListBuilder TokenBuilder, ref int np, TNameRecordList Names, ref TCellFunctionData fd2, TTokenOffset TokenOffset, ref bool HasAggregate)
        {
            //We need to recursively read parameters in back order to find out the name, which is stored as far as possible from the function :(
            TParsedTokenList ParsedList = TokenBuilder.ToParsedTokenList();

            ParsedList.ResetPositionToLast();
            for (int i = 0; i < np; i++) //np is +1. But we will move below the name, then inc 1, so we know there isn't a "neutral" token like parent or memarea, intead of the real thing.
            {
                ParsedList.Flush();
            }

            ParsedList.MoveBack();
            TNameToken bp = ParsedList.ForwardPop() as TNameToken;

            if (bp is TNameXToken)
            {
                return;                    //This name isn't an internal 2007 name.
            }
            if (bp == null)
            {
                return;
            }
            if (bp.NameIndex <= 0 || bp.NameIndex > Names.Count)
            {
                return;
            }
            string FunctionName = Names[bp.NameIndex - 1].Name;

            if (FunctionName.StartsWith("_xlfn.", StringComparison.InvariantCultureIgnoreCase))
            {
                TCellFunctionData fn = TXlsFunction.GetData(FunctionName.Substring("_xlfn.".Length));
                if (fn != null)
                {
                    if (fn.Index == (int)TFutureFunctions.Aggregate)
                    {
                        HasAggregate = true;
                    }

                    fd2 = fn;
                    int tPos = ParsedList.SavePosition();
                    TokenBuilder.RemoveAt(tPos);
                    TokenOffset.RemoveToken(tPos);
                    np--;
                }
            }
        }