Beispiel #1
0
        private static StrSpan GetContent中括号(char[] sql, StrSpan s)
        {
            char cLeft  = sql[s.iLeft];
            char cRight = sql[s.iRight];


            if (s.iLeft == s.iRight)
            {
                throw new SelectDataTableException("无效的 中括号, 缺少 结束中括号 。 ", sql, s.iLeft);
            }

            if (cRight != ']')
            {
                throw new SelectDataTableException("无效的 中括号, 缺少 结束中括号 。 ", sql, s.iRight);
            }


            if (s.iRight == s.iLeft + 1)
            {
                s         = new StrSpan(s.iLeft, s.iRight);
                s.isEmpty = true;

                return(s);
            }

            s = StrUtil.Trim(sql, s.iLeft + 1, s.iRight - 1, _whiteSpaces);

            return(new StrSpan(s.iLeft, s.iRight));
        }
Beispiel #2
0
        internal static List <string> GetColumnList(char[] sql, Word wColumns)
        {
            List <string> columnList = new List <string>();

            List <StrSpan> tokenList = StrUtil.Split(sql, wColumns.iLeft, wColumns.iRight, ',');

            char cLeft;
            char cRight;

            StrSpan s;

            for (int i = 0; i < tokenList.Count; i++)
            {
                s = tokenList[i];

                if (s.isEmpty)
                {
                    throw new SelectDataTableException("列名 不能 为空 。 ", sql, s.iLeft);
                }

                s = StrUtil.Trim(sql, s.iLeft, s.iRight, Parser._whiteSpaces);

                if (s.isEmpty)
                {
                    throw new SelectDataTableException("列名 不能 为空 。 ", sql, s.iLeft);
                }

                cLeft = sql[s.iLeft];

                if (s.iLeft == s.iRight && (cLeft == '[' || cLeft == ']'))
                {
                    throw new SelectDataTableException("无效的 列名 \"" + cLeft + "\" 。 ", sql, s.iLeft);
                }

                cRight = sql[s.iRight];

                if (cLeft == '[' && cRight == ']')
                {
                    if (s.iLeft == s.iRight - 1)
                    {
                        throw new SelectDataTableException("列名 不能 为空 。 ", sql, s.iLeft);
                    }


                    s = StrUtil.Trim(sql, s.iLeft + 1, s.iRight - 1, Parser._whiteSpaces);

                    if (s.isEmpty)
                    {
                        throw new SelectDataTableException("列名 不能 为空 。 ", sql, s.iLeft);
                    }

                    columnList.Add(new string(sql, s.iLeft, s.iRight - s.iLeft + 1));
                }
                else if (cLeft == '[' && cRight != ']')
                {
                    throw new SelectDataTableException("中括号 [] 未成对出现 。 ", sql, s.iLeft);
                }
                else if (cLeft != '[' && cRight == ']')
                {
                    throw new SelectDataTableException("中括号 [] 未成对出现 。 ", sql, s.iRight);
                }
                else
                {
                    s = StrUtil.Trim(sql, s.iLeft, s.iRight, Parser._whiteSpaces);

                    columnList.Add(new string(sql, s.iLeft, s.iRight - s.iLeft + 1));
                }
            }

            return(columnList);
        }
Beispiel #3
0
        private static StrSpan GetContent小括号(char[] sql, StrSpan s)
        {
            char cLeft  = sql[s.iLeft];
            char cRight = sql[s.iRight];


            if (s.iLeft == s.iRight)
            {
                throw new SelectDataTableException("无效的 小括号, 缺少 结束小括号 。 ", sql, s.iLeft);
            }


            if (s.iRight == s.iLeft + 1)
            {
                if (cRight == ')')
                {
                    s         = new StrSpan(s.iLeft, s.iRight);
                    s.isEmpty = true;

                    return(s);
                }
                else
                {
                    throw new SelectDataTableException("无效的 小括号, 缺少 结束小括号 。 ", sql, s.iRight);
                }
            }

            int i = FindWrapperEnd小括号(sql, s.iLeft, s.iRight);

            if (i == -1)
            {
                throw new SelectDataTableException("无效的 小括号, 缺少 结束小括号 。 ", sql, s.iRight);
            }

            if (i < s.iRight)
            {
                throw new SelectDataTableException("语法错误。存在无效的字符 。 ", sql, i + 1);
            }


            s = StrUtil.Trim(sql, s.iLeft + 1, s.iRight - 1, _whiteSpaces);  //  去掉 小括号 并 对 内容 Trim


            return(s);

            //if ( s.isEmpty )
            //{
            //    s = new StrSpan(s.iLeft, s.iRight);
            //    s.isEmpty = true;

            //    return s;
            //}


            //i = s.iLeft;
            //int j = s.iRight;

            //while (true)
            //{
            //    if (sql[i] == '(' && sql[j] == ')')
            //    {
            //        if (i + 1 == j)
            //        {
            //            s = new StrSpan(i, j);
            //            s.isEmpty = true;

            //            return s;
            //        }
            //        if (i + 1 <= j - 1)
            //        {
            //            i++;
            //            j--;
            //        }
            //    }
            //    else
            //    {
            //        break;
            //    }
            //    //return GetContent小括号(sql, s);    //  去掉 重复 括号
            //}

            //return new StrSpan(s.iLeft, s.iRight);
        }
Beispiel #4
0
        public static Content GetContent(char[] sql, int beginIndex, int endIndex)
        {
            if (beginIndex > endIndex)
            {
                throw new SelectDataTableException("beginIndex 应 小于等于 endIndex 。 beginIndex : " + beginIndex + " endIndex : " + endIndex + " 。 ", sql, beginIndex);
            }


            StrSpan s = StrUtil.Trim(sql, beginIndex, endIndex, Parser._whiteSpaces);

            Content content;

            if (s.isEmpty)
            {
                content         = new Content(s.iLeft, s.iRight, ContentType.None);
                content.isEmpty = true;

                return(content);
            }

            char cLeft  = sql[s.iLeft];
            char cRight = sql[s.iRight];

            if (cLeft == '\'')
            {
                s = GetContent单引号(sql, s);

                content = new Content(s.iLeft, s.iRight, ContentType.String);

                if (s.isEmpty)
                {
                    content.isEmpty = true;
                }

                return(content);
            }
            else if (cLeft == '[')
            {
                s = GetContent中括号(sql, s);
            }
            else if (cLeft == '(')
            {
                s = GetContent小括号(sql, s);

                content = new Content(s.iLeft, s.iRight, ContentType.Express);

                if (s.isEmpty)
                {
                    content.isEmpty = true;
                }

                return(content);
            }

            if (StrUtil.IsNumber(sql[s.iLeft]))
            {
                return(new Content(s.iLeft, s.iRight, ContentType.Number));
            }

            return(new Content(s.iLeft, s.iRight, ContentType.Column));

            //throw new Exception("语法错误。 在 第 " + s.iLeft + " 个 字符 \"" + sql[s.iLeft] + "\" 。");
        }