internal static void stackPushBracket(Stack stack, char c, int rownumber, int charnumber) { BCChar bcc = new BCChar(); bcc.charvalue = c; bcc.rownumber = rownumber; bcc.charnumber = charnumber; stack.Push(bcc); }
/// <summary> /// Check brackets balancing in text parameter. rownumber and charnumber are used for better error explaining /// </summary> /// <param name="text">Text to check</param> /// <param name="rownumber"></param> /// <param name="charnumber"></param> /// <returns></returns> internal static bool checkBrackets(string text, int rownumber, int charnumber) { Stack stack = new Stack(); // reading entire text, one character at a time for (int i = 0; i < text.Length; i++, charnumber++) { char c = text[i]; if ((c == '(' && checkRoundBrackets) || (c == '[' && checkSquareBrackets) || (c == '{' && checkCurlyBrackets) || (c == '<' && checkAngleBrackets)) { // it's an open bracket stackPushBracket(stack, c, rownumber, charnumber); } else if ((c == ')' && checkRoundBrackets) || (c == ']' && checkSquareBrackets) || (c == '}' && checkCurlyBrackets) || (c == '>' && checkAngleBrackets)) { // it's a close bracket if (stack.Count > 0) { // stack isn't empty: stack pop BCChar bcc_pop = (BCChar)stack.Pop(); char opened = bcc_pop.charvalue; // if brackets are not of the same type: error if ((c == ')' && opened != '(') || (c == ']' && opened != '[') || (c == '}' && opened != '{') || (c == '>' && opened != '<')) { displayError(bcc_pop.rownumber, bcc_pop.charnumber); return(false); } } else { // stack is empty: error displayError(rownumber, charnumber); return(false); } } else if (c == '\n') { // new line rownumber++; charnumber = 0; } } if (stack.Count > 0) { // stack isn't empty: error BCChar bcc_pop = (BCChar)stack.Pop(); displayError(bcc_pop.rownumber, bcc_pop.charnumber); return(false); } return(true); }