Пример #1
0
        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);
        }
Пример #2
0
        /// <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);
        }