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)); }
/// <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)); }
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); }