예제 #1
0
        private static FSharpTransform.Formula makeFSharpRange(ParseTreeNode input)
        {
            ParseTreeNode Cell1 = input.ChildNodes[0];
            ParseTreeNode Cell2 = input.ChildNodes[2];

            FSharpTransform.SuperCell C1;
            FSharpTransform.SuperCell C2;

            if (Cell1.ChildNodes[0].Type() == GrammarNames.Cell)
            {
                string   cell1Location = Cell1.ChildNodes[0].Print();
                Location L1            = new Location(cell1Location);
                C1 = FSharpTransform.makeCell(L1.Column, L1.Row);
            }
            else
            {
                C1 = GetDynamicCell(Cell1);
            }

            if (Cell1.ChildNodes[0].Type() == GrammarNames.Cell)
            {
                string   cell2Location = Cell2.ChildNodes[0].Print();
                Location L2            = new Location(cell2Location);
                C2 = FSharpTransform.makeCell(L2.Column, L2.Row);
            }
            else
            {
                C2 = GetDynamicCell(Cell2);
            }

            return(FSharpTransform.makeRange(C1, C2));
        }
        public FSharpMap <char, FSharpTransform.mapElement> CanBeAppliedonMap(ParseTreeNode source)
        {
            var FFrom   = fromFSharpTree;
            var FSource = CreateFSharpTree(source);

            return(FSharpTransform.CanBeAppliedonMap(FFrom, FSource));
        }
        public bool CanBeAppliedonBool(ParseTreeNode source)
        {
            var FFrom   = fromFSharpTree;
            var FSource = CreateFSharpTree(source);

            return(FSharpTransform.CanBeAppliedonBool(FFrom, FSource));
        }
예제 #4
0
        /// <summary>
        /// Change a C# parse tree to a F# AST
        /// </summary>
        public static FSharpTransform.Formula CreateFSharpTree(this ParseTreeNode input)
        {
            if (input.IsParentheses())
            {
                return(FSharpTransform.Formula.NewFunction("", ListModule.OfSeq(new [] { CreateFSharpTree(input.ChildNodes[0]) })));
            }

            input = input.SkipToRelevant();

            switch (input.Type())
            {
            case GrammarNames.FunctionCall:
            case GrammarNames.ReferenceFunctionCall:
            case GrammarNames.UDFunctionCall:
                var fname = input.GetFunction() + (input.IsNamedFunction()?"(":"");
                var args  = ListModule.OfSeq(input.GetFunctionArguments().Select(CreateFSharpTree));
                // Check for range
                if (fname == ":")
                {
                    return(makeFSharpRange(input));
                }
                return(FSharpTransform.makeFormula(fname, args));

            case GrammarNames.Reference:
                // ignore prefix
                return(CreateFSharpTree(input.ChildNodes.Count == 1 ? input.ChildNodes[0] : input.ChildNodes[1]));

            case GrammarNames.Cell:
                var L = new Location(input.Print());
                return(FSharpTransform.makeSuperCell(FSharpTransform.makeCell(L.Column, L.Row)));

            case GrammarNames.NamedRange:
                return(FSharpTransform.makeNamedRange(input.Print()));

            case TransformationRuleGrammar.Names.DynamicCell:
                //get variables from dynamic cell
                return(FSharpTransform.makeSuperCell(GetDynamicCell(input)));

            case TransformationRuleGrammar.Names.DynamicRange:
                var letter = input          // DynamicRange
                             .ChildNodes[0] // LowLetter
                             .Token.ValueString[0];
                return(FSharpTransform.makeDRange(letter));

            case GrammarNames.Constant:
            case GrammarNames.Number:
            case GrammarNames.Text:
            case GrammarNames.Bool:
            case GrammarNames.Error:
            case GrammarNames.RefError:
                return(FSharpTransform.makeConstant(input.Print()));

            case TransformationRuleGrammar.Names.DynamicConstant:
                return(FSharpTransform.makeDArgument(input.ChildNodes[0].Token.ValueString[1]));

            default:
                throw new ArgumentException($"Can't convert node type {input.Type()}", nameof(input));
            }
        }
        public bool CanBeAppliedonBool(string formula)
        {
            var source = ExcelFormulaParser.Parse(formula);

            var FFrom   = fromFSharpTree;
            var FSource = CreateFSharpTree(source);

            return(FSharpTransform.CanBeAppliedonBool(FFrom, FSource));
        }
        /// <summary>
        /// Apply this transformation rule on a parse tree
        /// </summary>
        public FSharpTransform.Formula ApplyOn(ParseTreeNode source)
        {
            var FFrom   = fromFSharpTree;
            var FTo     = toFSharpTree;
            var FSource = CreateFSharpTree(source);

            var result = FSharpTransform.ApplyOn(FTo, FFrom, FSource);

            return(result);
        }
        /// <summary>
        /// Apply this transformation rule on a formula
        /// </summary>
        public string ApplyOn(string formula)
        {
            var source = ExcelFormulaParser.Parse(formula);

            var FFrom   = fromFSharpTree;
            var FTo     = toFSharpTree;
            var FSource = CreateFSharpTree(source);

            var result = FSharpTransform.ApplyOn(FTo, FFrom, FSource);

            return(Print(result));
        }
예제 #8
0
        private static FSharpTransform.SuperCell GetDynamicCell(ParseTreeNode input)
        {
            ParseTreeNode DynamicCell = input.SkipToRelevant();

            ParseTreeNode VarExpression1 = DynamicCell.ChildNodes[0];
            ParseTreeNode VarExpression2 = DynamicCell.ChildNodes[2];

            char Var1;
            char Var2;
            char Var3;
            char Var4;

            if (VarExpression1.ChildNodes.Count == 1)
            {
                Var1 = Print(VarExpression1.ChildNodes[0])[0];
                Var2 = '0';
            }
            else
            {
                Var1 = Print(VarExpression1.ChildNodes[0])[0];
                Var2 = Print(VarExpression1.ChildNodes[2])[0];
            }

            if (VarExpression2.ChildNodes.Count == 1)
            {
                Var3 = Print(VarExpression2.ChildNodes[0])[0];
                Var4 = '0';
            }
            else
            {
                Var3 = Print(VarExpression2.ChildNodes[0])[0];
                Var4 = Print(VarExpression2.ChildNodes[2])[0];
            }

            FSharpTransform.SuperCell x = FSharpTransform.makeDCell(Var1, Var2, Var3, Var4);
            return(x);
        }