private void CheckCommasInFunction(RevitFunctionModel function, string formula, int functionEndPos) { var numOfArgs = FunctionTypeAnalizer.CheckNumberOfArgs(function.FunctionType); if (numOfArgs > 1) { bool insideChildFunction = false; int childFunctionCounter = 0; var correctNumOfCommas = numOfArgs - 1; int numOfCommas = 0; for (int i = function.StartPos + 1; i < functionEndPos; i++) { char character = formula[i]; if (character.Equals(openingBracket)) { if (childFunctionCounter == 0) { insideChildFunction = true; } childFunctionCounter++; } else if (character.Equals(closingBracket)) { childFunctionCounter--; if (childFunctionCounter == 0) { insideChildFunction = false; } } if (!insideChildFunction) { if (character.Equals(comma)) { numOfCommas++; } } if (correctNumOfCommas < numOfCommas) { throw new Exception($"Unnecessary comma in formula at index {i} - possibly bracket around this index."); } } if (correctNumOfCommas > numOfCommas) { throw new Exception( $"Missing commas in {function.FunctionTypeName}(at index {function.StartPos}).\nFunction should have {correctNumOfCommas} commas but contains only {numOfCommas}."); } } }
private List <RevitFunctionModel> AssignFunctions(List <RevitFunctionsPositionModel> functionsTypeList, List <RevitFunctionModel> revitFunctionsInFormula) { int iterator = 0; int actualParentFunctionNum = -1; List <RevitFunctionModel> revitFunctions = new List <RevitFunctionModel>(); RevitFunctionModel function = null, parentFunction = null; foreach (RevitFunctionsPositionModel functionPos in functionsTypeList) { // if(heigh=15, 145, if(and(a>15, b<16), 245,deep)) // if(heigh=15, 145, if(and(a>15, b<16), and( ),deep)) // if(if(and(a>15, b<16), and(4,5),deep), 145,and(heigh=15,h=2) ) if (functionPos.Stage == RevitEnums.FunctionStage.Open) { if (actualParentFunctionNum < iterator) { parentFunction = function; } else if (actualParentFunctionNum > iterator) { parentFunction = parentFunction.ParentFunction; } actualParentFunctionNum = iterator; function = revitFunctionsInFormula.First(fun => fun.StartPos == functionPos.Position); if (actualParentFunctionNum == 0) { revitFunctions.Add(function); } else { parentFunction.AddChildFunction(function); } iterator++; } else if (functionPos.Stage == RevitEnums.FunctionStage.Close) { iterator--; } } return(revitFunctions); }
public List <RevitFunctionModel> Analize(string formula) { if (!formula.Contains(openingBracket) || !formula.Contains(closingBracket)) { var function = new RevitFunctionModel(RevitEnums.FunctionType.SimpleFunction); function.AddArgument(formula); return(new List <RevitFunctionModel>() { function }); } List <RevitFunctionModel> revitFunctionsInFormula = GetFunctionsInFormula(formula); List <RevitFunctionsPositionModel> bracketsPosList = GetBracketsPosList(formula); CountCommas(formula, revitFunctionsInFormula); return(AssignFunctions(bracketsPosList, revitFunctionsInFormula)); }
private List <RevitFunctionModel> GetFunctionsInFormula(string formula) { var functionsList = new List <RevitFunctionModel>(); for (int i = 0; i < formula.Length; i++) { char character = formula[i]; if (character.Equals(openingBracket)) { RevitFunctionModel revitFunction = null; foreach (RevitEnums.FunctionType revitEnum in Enum.GetValues(typeof(RevitEnums.FunctionType))) { var descLenght = revitEnum.GetDescription().Length; var startIndex = i - descLenght; if (startIndex < 0) { startIndex = 0; } if (descLenght < formula.Length) { string function = formula.Substring(startIndex, descLenght); bool isContaining = Regex.IsMatch(function, $@"\b{revitEnum.GetDescription()}\b", RegexOptions.IgnoreCase); if (isContaining) { revitFunction = new RevitFunctionModel(revitEnum) { StartPos = i }; functionsList.Add(revitFunction); } } } if (revitFunction == null) { throw new Exception($"Opening bracket without known function at index {i}."); } } } return(functionsList); }