private FormulaFormatFlag GetCurrentFormatSetting() { FormulaFormatFlag flag = FormulaFormatFlag.None; if (chkBeforeOperator.Checked) { flag |= FormulaFormatFlag.SpaceBeforeOperator; } if (chkAfterOperator.Checked) { flag |= FormulaFormatFlag.SpaceAfterOperator; } if (chkBeforeComma.Checked) { flag |= FormulaFormatFlag.SpaceBeforeComma; } if (chkAfterComma.Checked) { flag |= FormulaFormatFlag.SpaceAfterComma; } if (chkBeforeParamList.Checked) { flag |= FormulaFormatFlag.SpaceBeforeParameterList; } if (chkAfterParamList.Checked) { flag |= FormulaFormatFlag.SpaceAfterParameterList; } if (chkBeforeSubExpr.Checked) { flag |= FormulaFormatFlag.SpaceBeforeSubExpression; } if (chkAfterSubExpr.Checked) { flag |= FormulaFormatFlag.SpaceAfterSubExpression; } if (chkBeforePercent.Checked) { flag |= FormulaFormatFlag.SpaceBeforePercent; } if (chkAfterMinus.Checked) { flag |= FormulaFormatFlag.SpaceAfterMinus; } if (chkFunctionNameUppercase.Checked) { flag |= FormulaFormatFlag.FunctionNameAutoUppercase; } if (chkSpaceAfterFunctionName.Checked) { flag |= FormulaFormatFlag.SpaceAfterFunctionName; } return(flag); }
private void SetFormatStylesByFlag(FormulaFormatFlag flag) { isUpdatingUI = true; chkBeforeOperator.Checked = flag.Has(FormulaFormatFlag.SpaceBeforeOperator); chkAfterOperator.Checked = flag.Has(FormulaFormatFlag.SpaceAfterOperator); chkBeforeComma.Checked = flag.Has(FormulaFormatFlag.SpaceBeforeComma); chkAfterComma.Checked = flag.Has(FormulaFormatFlag.SpaceAfterComma); chkBeforeParamList.Checked = flag.Has(FormulaFormatFlag.SpaceBeforeParameterList); chkAfterParamList.Checked = flag.Has(FormulaFormatFlag.SpaceAfterParameterList); chkBeforeSubExpr.Checked = flag.Has(FormulaFormatFlag.SpaceBeforeSubExpression); chkAfterSubExpr.Checked = flag.Has(FormulaFormatFlag.SpaceAfterSubExpression); chkBeforePercent.Checked = flag.Has(FormulaFormatFlag.SpaceBeforePercent); chkAfterMinus.Checked = flag.Has(FormulaFormatFlag.SpaceAfterMinus); chkFunctionNameUppercase.Checked = flag.Has(FormulaFormatFlag.FunctionNameAutoUppercase); chkSpaceAfterFunctionName.Checked = flag.Has(FormulaFormatFlag.SpaceAfterFunctionName); isUpdatingUI = false; GenerateFormula(); }
private static void AddSpaceIfFlag(StringBuilder sb, FormulaFormatFlag flag, FormulaFormatFlag target) { if ((flag & target) == target && (sb.Length == 0 || sb[sb.Length - 1] != ' ')) { sb.Append(' '); } }
/// <summary> /// Generate formula form a syntax tree in memory by specified format styles /// </summary> /// <param name="node">root node of syntax tree used to generate formula</param> /// <param name="flag">generating format style flags</param> /// <returns>formula generated from a syntax tree</returns> internal static string Generate(string input, STNode node, FormulaFormatFlag flag) { StringBuilder sb = new StringBuilder(); GenerateExpression(sb, input, node, flag); if (sb[sb.Length - 1] == ' ') { sb.Remove(sb.Length - 1, 1); } return(sb.ToString()); }
private void GenerateFormula() { if (currentSyntaxTree != null) { FormulaFormatFlag flag = GetCurrentFormatSetting(); string formula = FormulaRefactor.Generate(txtGeneratedFormula.Text, currentSyntaxTree, flag); txtGeneratedFormula.Text = formula; } else { txtGeneratedFormula.Text = string.Empty; } }
public static bool Has(this FormulaFormatFlag flag, FormulaFormatFlag target) { return((flag & target) == target); }
private static void GenerateExpression(StringBuilder sb, string input, STNode node, FormulaFormatFlag flag) { switch (node.Type) { default: sb.Append(node.ToString()); break; case STNodeType.CELL: sb.Append(((STCellNode)node).Position.ToAddress()); break; case STNodeType.RANGE: sb.Append(((STRangeNode)node).Range.ToAddress()); break; case STNodeType.NUMBER: sb.Append(((STNumberNode)node).Value); break; case STNodeType.STRING: sb.Append(((STStringNode)node).Text); break; case STNodeType.IDENTIFIER: sb.Append(((STIdentifierNode)node).Identifier); break; case STNodeType.ADD: GenerateOperatorString(sb, input, "+", node, flag); break; case STNodeType.SUB: GenerateOperatorString(sb, input, "-", node, flag); break; case STNodeType.MUL: GenerateOperatorString(sb, input, "*", node, flag); break; case STNodeType.DIV: GenerateOperatorString(sb, input, "/", node, flag); break; case STNodeType.POW: GenerateOperatorString(sb, input, "^", node, flag); break; case STNodeType.GREAT_THAN: GenerateOperatorString(sb, input, ">", node, flag); break; case STNodeType.GREAT_EQUALS: GenerateOperatorString(sb, input, ">=", node, flag); break; case STNodeType.LESS_THAN: GenerateOperatorString(sb, input, "<", node, flag); break; case STNodeType.LESS_EQUALS: GenerateOperatorString(sb, input, "<=", node, flag); break; case STNodeType.EQUALS: GenerateOperatorString(sb, input, "=", node, flag); break; case STNodeType.CONNECT: GenerateOperatorString(sb, input, "&", node, flag); break; case STNodeType.UNARY_PERCENT: GenerateExpression(sb, input, node.Children[0], flag); AddSpaceIfFlag(sb, flag, FormulaFormatFlag.SpaceBeforePercent); sb.Append('%'); break; case STNodeType.FUNCTION_CALL: var funNode = (STFunctionNode)node; string funName = funNode.Name; if ((flag & FormulaFormatFlag.FunctionNameAutoUppercase) == FormulaFormatFlag.FunctionNameAutoUppercase) { sb.Append(funName.ToUpper()); } else { sb.Append(funName); } AddSpaceIfFlag(sb, flag, FormulaFormatFlag.SpaceAfterFunctionName); sb.Append('('); AddSpaceIfFlag(sb, flag, FormulaFormatFlag.SpaceBeforeParameterList); for (int i = 0; i < node.Children.Count; i++) { if (i > 0) { AddSpaceIfFlag(sb, flag, FormulaFormatFlag.SpaceBeforeComma); sb.Append(','); AddSpaceIfFlag(sb, flag, FormulaFormatFlag.SpaceAfterComma); } GenerateExpression(sb, input, node.Children[i], flag); } AddSpaceIfFlag(sb, flag, FormulaFormatFlag.SpaceAfterParameterList); sb.Append(')'); break; case STNodeType.SUB_EXPR: sb.Append('('); AddSpaceIfFlag(sb, flag, FormulaFormatFlag.SpaceBeforeSubExpression); GenerateExpression(sb, input, node.Children[0], flag); AddSpaceIfFlag(sb, flag, FormulaFormatFlag.SpaceAfterSubExpression); sb.Append(')'); break; case STNodeType.UNARY_MINUS: sb.Append('-'); AddSpaceIfFlag(sb, flag, FormulaFormatFlag.SpaceAfterMinus); GenerateExpression(sb, input, node.Children[0], flag); break; } }
private static void GenerateOperatorString(StringBuilder sb, string input, string op, STNode node, FormulaFormatFlag flag) { var left = node.Children[0]; var right = node.Children[1]; GenerateExpression(sb, input, left, flag); if ((flag & FormulaFormatFlag.SpaceBeforeOperator) == FormulaFormatFlag.SpaceBeforeOperator) { sb.Append(' '); } sb.Append(op); if ((flag & FormulaFormatFlag.SpaceAfterOperator) == FormulaFormatFlag.SpaceAfterOperator) { sb.Append(' '); } GenerateExpression(sb, input, right, flag); }