コード例 #1
0
ファイル: 函数_Parser.cs プロジェクト: kelin-xycs/InnerC
        private static 类型 Parse_返回类型(char[] chars, int beginIndex, int endIndex, out int 报错位置)
        {
            报错位置 = -1;

            类型 返回类型 = new 类型("void", 0, null, chars, endIndex);

            //if (beginIndex > endIndex)
            //{
            //    报错位置 = -1;
            //    return 返回类型;
            //}
            StrSpan span = StrUtil.Trim(chars, beginIndex, endIndex, Parser._whiteSpaces);

            if (span.isEmpty)
            {
                //报错位置 = -1;
                return(返回类型);
            }

            char c = chars[endIndex];

            if (!StrUtil.IsOneOf(c, Parser._whiteSpaces和星号))
            {
                报错位置 = endIndex;
                return(返回类型);
            }

            int 空白和星号开始位置的前一个位置 = StrUtil.FindBackwardUntilNot(chars, span.iLeft, span.iRight, Parser._whiteSpaces和星号);

            if (空白和星号开始位置的前一个位置 == -1)
            {
                报错位置 = span.iRight;
                return(返回类型);
            }

            c = chars[空白和星号开始位置的前一个位置];

            if (!Util.Check_是否_下划线字母数字(c))
            {
                报错位置 = span.iRight;
                return(返回类型);
            }

            int 类型开始位置的前一个位置 = Parser.向左寻找_不是_下划线字母数字_的字符(chars, span.iLeft, 空白和星号开始位置的前一个位置);

            int 类型开始位置;

            if (类型开始位置的前一个位置 == -1)
            {
                类型开始位置 = span.iLeft;
            }
            else
            {
                类型开始位置 = 类型开始位置的前一个位置 + 1;
            }

            c = chars[类型开始位置];

            if (!(c == '_' || StrUtil.IsLetter(c)))
            {
                报错位置 = span.iRight;
                return(返回类型);
            }

            string type = new string(chars, 类型开始位置, 空白和星号开始位置的前一个位置 - 类型开始位置 + 1);

            int 星号Count = 0;

            for (int i = 空白和星号开始位置的前一个位置 + 1; i <= span.iRight; i++)
            {
                c = chars[i];

                if (c == '*')
                {
                    星号Count++;
                }
            }

            返回类型 = new 类型(type, 星号Count, null, chars, 类型开始位置);

            if (span.iLeft < 类型开始位置)
            {
                报错位置 = 类型开始位置 - 1;
            }

            return(返回类型);
        }
コード例 #2
0
        public static List <表达式段> _小括号中括号单引号双引号_分段(char[] chars, int beginIndex, int endIndex)
        {
            char c;

            List <表达式段> list = new List <表达式段>();

            int j;

            for (int i = beginIndex; i <= endIndex;)
            {
                c = chars[i];

                if (c == '(')
                {
                    j = Parser.Find_小括号_右(chars, i + 1, endIndex);

                    if (j == -1)
                    {
                        throw new 语法错误_Exception("未结束的小括号,缺少右小括号 。", chars, i);
                    }

                    list.Add(new 表达式段(i, j, 表达式段_Type.小括号段));

                    i = j + 1;

                    continue;
                }

                if (c == '[')
                {
                    j = Parser.Find_中括号_右(chars, i + 1, endIndex);

                    if (j == -1)
                    {
                        throw new 语法错误_Exception("未结束的中括号,缺少右中括号 。", chars, i);
                    }

                    list.Add(new 表达式段(i, j, 表达式段_Type.中括号段));

                    i = j + 1;

                    continue;
                }

                if (c == '\'')
                {
                    j = Parser.Find_单引号_右(chars, i + 1, endIndex);

                    if (j == -1)
                    {
                        throw new 语法错误_Exception("未结束的单括号,缺少右单引号 。", chars, i);
                    }

                    list.Add(new 表达式段(i, j, 表达式段_Type.单引号段));

                    i = j + 1;

                    continue;
                }

                if (c == '"')
                {
                    j = Parser.Find_双引号_右(chars, i + 1, endIndex);

                    if (j == -1)
                    {
                        throw new 语法错误_Exception("未结束的单括号,缺少右双引号 。", chars, i);
                    }

                    list.Add(new 表达式段(i, j, 表达式段_Type.双引号段));

                    i = j + 1;

                    continue;
                }


                j = StrUtil.FindForward(chars, i + 1, endIndex, _左小括号左中括号单引号双引号);

                if (j == -1)
                {
                    list.Add(new 表达式段(i, endIndex, 表达式段_Type.普通段));
                    break;
                }

                list.Add(new 表达式段(i, j - 1, 表达式段_Type.普通段));

                i = j;
            }

            return(list);
        }
コード例 #3
0
        private static if_分句 Parse_if_分句(char[] chars, int beginIndex, int endIndex, out int j)
        {
            j = -1;

            StrSpan span = StrUtil.Trim(chars, beginIndex, endIndex, Parser._whiteSpaces);

            if (span.isEmpty)
            {
                return(null);
            }

            bool b = Parser.开头一段_Equals(chars, span.iLeft, span.iRight, "if");

            if (!b)
            {
                return(null);
            }

            int 左小括号位置 = StrUtil.FindForwardUntilNot(chars, span.iLeft + 2, span.iRight, Parser._whiteSpaces);

            if (左小括号位置 == -1)
            {
                throw new InnerCException("未结束的 if 语句 。", chars, span.iLeft + 1);
            }

            char c = chars[左小括号位置];

            if (c != '(')
            {
                throw new InnerCException("if 语句 缺少条件判断 左小括号 。", chars, 左小括号位置);
            }

            int 右小括号位置 = Parser.Find_小括号_右(chars, 左小括号位置 + 1, span.iRight);

            if (右小括号位置 == -1)
            {
                throw new InnerCException("if 语句 缺少条件判断 右小括号 。", chars, 左小括号位置 + 1);
            }


            StrSpan span判断 = StrUtil.Trim(chars, 左小括号位置 + 1, 右小括号位置 - 1, Parser._whiteSpaces);

            if (span判断.isEmpty)
            {
                throw new InnerCException("if 语句 缺少判断表达式 。", chars, 左小括号位置);
            }

            表达式 if_判断 = 表达式_Parser.Parse(chars, 左小括号位置 + 1, 右小括号位置 - 1);


            StrSpan span子句 = StrUtil.Trim(chars, 右小括号位置 + 1, span.iRight, Parser._whiteSpaces);

            if (span子句.isEmpty)
            {
                throw new InnerCException("if 语句 缺少子句 。", chars, 右小括号位置 + 1);
            }

            块作用域 子句 = Parse_子句(chars, span子句.iLeft, span子句.iRight, out j);

            //j = span子句.iRight;

            return(new if_分句(if_判断, 子句));
        }
コード例 #4
0
ファイル: 函数_Parser.cs プロジェクト: kelin-xycs/InnerC
        public static 函数 Parse(char[] chars, 第一层_代码块 代码块)
        {
            //int i;

            //int beginIndex = 上一个大括号块 == null ? 0 : 上一个大括号块.iRight + 1;
            //int endIndex = 大括号块.iLeft - 1;

            //i = Parser.从右向左寻找_分号_单引号_双引号(chars, beginIndex, endIndex);

            //if (i != -1)
            //    beginIndex = i + 1;

            //StrSpan span = new StrSpan(beginIndex, 大括号块.iRight);

            //int args_beginIndex;
            //int args_endIndex;

            StrSpan span = StrUtil.Trim(chars, 代码块.iLeft, 代码块.iRight, Parser._whiteSpaces);

            int 右小括号位置 = StrUtil.FindBackwardUntilNot(chars, span.iLeft, 代码块.大括号块.iLeft - 1, Parser._whiteSpaces);

            if (右小括号位置 == -1)
            {
                throw new 语法错误_Exception("函数定义错误: 函数头为空 。", chars, 代码块.大括号块.iLeft - 1);
            }

            if (chars[右小括号位置] != ')')
            {
                throw new 语法错误_Exception("函数定义错误: 函数头 缺少 右小括号 \"(\" 。", chars, 右小括号位置);
            }

            //int 右小括号位置 = StrUtil.FindBackward(chars, 代码块.iLeft, 代码块.大括号块.iLeft - 1, ')');

            //if (右小括号位置 == -1)
            //    throw new InnerCException("函数定义错误: 函数头 缺少 右小括号 \"(\" 。", chars, beginIndex - 1);

            //args_endIndex = i - 1;
            //beginIndex = i - 1;

            int 左小括号位置 = StrUtil.FindBackward(chars, span.iLeft, 右小括号位置 - 1, '(');

            if (左小括号位置 == -1)
            {
                throw new 语法错误_Exception("函数定义错误: 函数头 缺少 左小括号 \"(\" 。", chars, span.iLeft);
            }

            int 函数名结束位置 = StrUtil.FindBackwardUntilNot(chars, span.iLeft, 左小括号位置 - 1, Parser._whiteSpaces);

            if (!Util.Check_是否_下划线字母数字(chars[函数名结束位置]))
            {
                throw new 语法错误_Exception("函数定义错误: 缺少 函数名 。", chars, 函数名结束位置);
            }

            int 函数名开始位置的前一个位置 = Parser.向左寻找_不是_下划线字母数字_的字符(chars, span.iLeft, 函数名结束位置);



            int 函数名开始位置;

            if (函数名开始位置的前一个位置 == -1)
            {
                函数名开始位置 = span.iLeft;
            }
            else
            {
                函数名开始位置 = 函数名开始位置的前一个位置 + 1;
            };

            char c = chars[函数名开始位置];

            string 函数名 = new string(chars, 函数名开始位置, 函数名结束位置 - 函数名开始位置 + 1);

            if (!(c == '_' || StrUtil.IsLetter(c)))
            {
                throw new 语法错误_Exception("无效的 函数名 \"" + 函数名 + "\",函数名 应由 下划线字母数字 组成且以 下划线或字母 开头 。", chars, 函数名开始位置);
            }

            if (Util.Check_是否关键字(函数名))
            {
                throw new 语法错误_Exception("无效的 函数名 \"" + 函数名 + "\",函数名 不能和 关键字 相同 。", chars, 函数名开始位置);
            }

            //变量声明 返回类型;

            //if (函数名开始位置 == span.iLeft)
            //{
            //    return Parse(chars, -1, -1, span.iLeft, 函数名结束位置, 左小括号位置, 右小括号位置, 代码块.大括号块.iLeft, 代码块.大括号块.iRight);
            //}


            //c = chars[函数名开始位置 - 1];

            //if (!StrUtil.IsOneOf(c, Parser._whiteSpaces和星号))
            //    throw new InnerCException("未结束的语句,可能缺少分号 \";\" 。", chars, 函数名开始位置 - 1);

            int 报错位置;

            类型 返回类型 = Parse_返回类型(chars, span.iLeft, 函数名开始位置 - 1, out 报错位置);

            if (报错位置 != -1)
            {
                throw new 语法错误_Exception("未结束的语句,可能缺少分号 \";\" 。", chars, 报错位置);
            }


            作用域  形参列表 = Parse_形参列表(chars, 左小括号位置, 右小括号位置);
            块作用域 函数体  = Parse_函数体(chars, 代码块.大括号块);



            return(new 函数(返回类型, 函数名, 形参列表, 函数体, 函数名开始位置));

            //int 空白和星号开始的位置的前一个位置 = StrUtil.FindBackwardUntilNot(chars, span.iLeft, 函数名开始位置 - 1, Parser._whiteSpaces和星号);

            //int 空白和星号开始位置;

            //if (空白和星号开始的位置的前一个位置 == -1)
            //{
            //    K
            //}


            //args_beginIndex = i + 1;
            //beginIndex = i - 1;

            //StrSpan 函数名和返回值 = StrUtil.Trim(chars, beginIndex, endIndex, Parser._whiteSpaces);

            //if (函数名和返回值.isEmpty)
            //    throw new InnerCException("函数定义错误: 缺少 函数名 。", chars, beginIndex - 1);

            //StrSpan[] spans = Parser.从右向左寻找第一个空白字符以此Split将得到的两个字符串Trim返回(chars, 函数名和返回值.iLeft, 函数名和返回值.iRight);

            //StrSpan 参数列表 = new StrSpan(args_beginIndex, args_endIndex);
            //StrSpan 函数体 = StrUtil.Trim(chars, 大括号块.iLeft + 1, 大括号块.iRight - 1, Parser._whiteSpaces);

            //return new 函数块(span, spans[0], spans[1], 参数列表, 函数体);
        }
コード例 #5
0
ファイル: 表达式_Parser.cs プロジェクト: kelin-xycs/InnerC
        public static 表达式 Parse(char[] chars, int beginIndex, int endIndex)
        {
            StrSpan span = StrUtil.Trim(chars, beginIndex, endIndex, Parser._whiteSpaces);

            if (span.isEmpty)
            {
                throw new 语法错误_Exception("无效的表达式 。 缺少内容 。", chars, beginIndex);
            }


            //List<表达式段> list = 按_小括号中括号双引号单引号_分段(chars, span.iLeft, span.iRight);

            运算符 op = Get_优先级最小的左右结合运算符和右结合运算符(chars, span.iLeft, span.iRight);

            if (op == null)
            {
                return(常量_变量_字段_指针字段_数组元素_函数调用_函数指针调用_调用链_Parser.Parse(chars, span.iLeft, span.iRight));
            }

            表达式 op_左边的表达式 = null;
            表达式 op_右边的表达式;

            if (op.op == "!" || op.type == 运算符_Type.Cast || op.type == 运算符_Type.指针取值 || op.type == 运算符_Type.取地址)
            {
                StrSpan 左边的内容 = StrUtil.Trim(chars, span.iLeft, op.iLeft - 1, Parser._whiteSpaces);

                if (!左边的内容.isEmpty)
                {
                    throw new 语法错误_Exception("无效的内容,缺少运算符 。", chars, 左边的内容.iRight);
                }

                op_右边的表达式 = Parse(chars, op.iRight + 1, endIndex);
            }
            else
            {
                op_左边的表达式 = Parse(chars, span.iLeft, op.iLeft - 1);
                op_右边的表达式 = Parse(chars, op.iRight + 1, endIndex);
            }


            if (op.type == 运算符_Type.Cast)
            {
                return(new Cast(op.castType, op_右边的表达式, chars, op.iLeft));
            }
            if (op.type == 运算符_Type.指针取值)
            {
                return(new 指针取值(op_右边的表达式, chars, op.iLeft));
            }
            if (op.type == 运算符_Type.取地址)
            {
                return(new 取地址(op_右边的表达式, chars, op.iLeft));
            }

            if (op.op == "+")
            {
                return(new 加(op_左边的表达式, op_右边的表达式, chars, op.iLeft));
            }
            else if (op.op == "-")
            {
                return(new 减(op_左边的表达式, op_右边的表达式, chars, op.iLeft));
            }
            else if (op.op == "*")
            {
                return(new 乘(op_左边的表达式, op_右边的表达式, chars, op.iLeft));
            }
            else if (op.op == "/")
            {
                return(new 除(op_左边的表达式, op_右边的表达式, chars, op.iLeft));
            }
            else if (op.op == "==")
            {
                return(new 等于(op_左边的表达式, op_右边的表达式, chars, op.iLeft));
            }
            else if (op.op == ">")
            {
                return(new 大于(op_左边的表达式, op_右边的表达式, chars, op.iLeft));
            }
            else if (op.op == "<")
            {
                return(new 小于(op_左边的表达式, op_右边的表达式, chars, op.iLeft));
            }
            else if (op.op == ">=")
            {
                return(new 大于等于(op_左边的表达式, op_右边的表达式, chars, op.iLeft));
            }
            else if (op.op == "<=")
            {
                return(new 小于等于(op_左边的表达式, op_右边的表达式, chars, op.iLeft));
            }
            else if (op.op == "!=")
            {
                return(new  等于(op_左边的表达式, op_右边的表达式, chars, op.iLeft));
            }
            else if (op.op == "&&")
            {
                return(new 与(op_左边的表达式, op_右边的表达式, chars, op.iLeft));
            }
            else if (op.op == "||")
            {
                return(new 或(op_左边的表达式, op_右边的表达式, chars, op.iLeft));
            }
            else if (op.op == "!")
            {
                return(new 非(op_右边的表达式, chars, op.iLeft));
            }
            else if (op.op == "=")
            {
                return(new 赋值(op_左边的表达式, op_右边的表达式, chars, op.iLeft));
            }

            throw new 语法错误_Exception("无效的运算符 \"" + op.op + "\" 。", chars, op.iLeft);
        }
コード例 #6
0
        public static if_语句 Parse(char[] chars, int beginIndex, int endIndex, out int j)
        {
            j = -1;

            StrSpan span = StrUtil.Trim(chars, beginIndex, endIndex, Parser._whiteSpaces);

            if (span.isEmpty)
            {
                return(null);
            }

            //bool b = Parser.开头一段_Equals(chars, span.iLeft, span.iRight, "if");

            //if (!b)
            //    return null;

            //if ()

            if_分句 if_分句 = Parse_if_分句(chars, span.iLeft, span.iRight, out j);

            if (if_分句 == null)
            {
                return(null);
            }

            List <if_分句> if_分句_和_else_if_分句_List = new List <if_分句>();
            块作用域         最后结尾的_else_分句           = null;

            if_分句_和_else_if_分句_List.Add(if_分句);

            while (true)
            {
                //b = Parser.开头一段_Equals(chars, span.iLeft, span.iRight, "if");

                //if (!b)
                //    break;

                //if_分句 if_分句 = Parse_if_分句(chars, span.iLeft, span.iRight, out j);

                //if_分句_和_else_if_分句_List.Add(if_分句);

                span = StrUtil.Trim(chars, j + 1, span.iRight, Parser._whiteSpaces);

                if (span.isEmpty)
                {
                    break;
                }

                bool b = Parser.开头一段_Equals(chars, span.iLeft, span.iRight, "else");

                if (!b)
                {
                    break;
                }

                int else后的位置 = span.iLeft + 4;

                if (else后的位置 > span.iRight)
                {
                    break;
                }

                char c = chars[span.iLeft + 4];

                if (!StrUtil.IsOneOf(c, Parser._whiteSpaces))
                {
                    break;
                }

                //int p = StrUtil.FindForwardUntilNot(chars, span.iLeft + 4, span.iRight, Parser._whiteSpaces);

                //if (p == -1)
                //    break;

                int else结束位置 = span.iLeft + 3;

                span = StrUtil.Trim(chars, else后的位置, span.iRight, Parser._whiteSpaces);

                if (span.isEmpty)
                {
                    throw new InnerCException("\"else\" 后缺少子句 。", chars, else结束位置);
                }



                if_分句 = Parse_if_分句(chars, span.iLeft, span.iRight, out j);

                if (if_分句 != null)
                {
                    if_分句_和_else_if_分句_List.Add(if_分句);

                    continue;
                }
                //b = Parser.开头一段_Equals(chars, span.iLeft, span.iRight, "if");

                //if (b)
                //{

                //    if_分句 = Parse_if_分句(chars, span.iLeft, span.iRight, out j);

                //    if_分句_和_else_if_分句_List.Add(if_分句);

                //    continue;
                //}


                最后结尾的_else_分句 = Parse_子句(chars, span.iLeft, span.iRight, out j);

                //if (最后结尾的_else_分句.list语句.Count == 0)
                //    throw new InnerCException("无效的语句 。", chars, span.iLeft);

                break;
            }

            //if (1 == 1)
            //{

            //}
            //else
            //{

            //}

            return(new if_语句(if_分句_和_else_if_分句_List, 最后结尾的_else_分句));
        }
        private static 表达式 Parse_数组元素(char[] chars, List <表达式段> list)
        {
            表达式段 段;

            List <表达式段> list右边连续的中括号段 = new List <表达式段>();

            int p = -1;

            for (int i = list.Count - 1; i >= 0; i--)
            {
                段 = list[i];

                if (段.type != 表达式段_Type.中括号段)
                {
                    break;
                }

                p = i;
                //list右边连续的中括号段.Add(段);
            }

            if (p != -1)
            {
                for (int i = p; i < list.Count; i++)
                {
                    段 = list[i];

                    list右边连续的中括号段.Add(段);
                }
            }

            if (list右边连续的中括号段.Count == 0)
            {
                return(null);
            }

            表达式 express;

            List <表达式> list下标 = new List <表达式>();

            for (int i = 0; i < list右边连续的中括号段.Count; i++)
            {
                段 = list右边连续的中括号段[i];

                StrSpan span下标 = StrUtil.Trim(chars, 段.iLeft + 1, 段.iRight - 1, Parser._whiteSpaces);

                if (span下标.isEmpty)
                {
                    list下标.Add(null);
                    continue;
                }

                express = 表达式_Parser.Parse(chars, span下标.iLeft, span下标.iRight);

                express.参考位置_iLeft = 段.iLeft;

                list下标.Add(express);
            }

            StrSpan 左边的部分 = StrUtil.Trim(chars, list[0].iLeft, list右边连续的中括号段[0].iLeft - 1, Parser._whiteSpaces);

            if (左边的部分.isEmpty)
            {
                throw new InnerCException("\"[ ]\" 前面缺少 数组变量 或者 可以返回一个数组指针的表达式 。", chars, list[0].iLeft);
            }

            表达式 左边的表达式 = Parse(chars, 左边的部分.iLeft, 左边的部分.iRight);

            return(new 数组元素(左边的表达式, list下标));
        }
        private static 表达式 Parse_字段(char[] chars, List <表达式段> list)
        {
            表达式段 段 = list[list.Count - 1];

            if (段.type != 表达式段_Type.普通段)
            {
                return(null);
            }

            string 点或箭头;

            int 点或箭头的位置 = 寻找最右边的点或箭头的位置(chars, 段.iLeft, 段.iRight, out 点或箭头);

            if (点或箭头的位置 == -1)
            {
                return(null);
            }

            if (点或箭头 != ".")
            {
                return(null);
            }

            StrSpan 右边的部分 = StrUtil.Trim(chars, 点或箭头的位置 + 1, 段.iRight, Parser._whiteSpaces);

            if (右边的部分.isEmpty)
            {
                throw new InnerCException("\".\" 后面缺少 字段名 。", chars, 点或箭头的位置);
            }

            StrSpan 左边的部分 = StrUtil.Trim(chars, list[0].iLeft, 点或箭头的位置 - 1, Parser._whiteSpaces);

            if (左边的部分.isEmpty)
            {
                throw new InnerCException("\".\" 前面缺少 变量 或者 表达式 。", chars, 点或箭头的位置);
            }

            表达式 express = Parse(chars, 左边的部分.iLeft, 左边的部分.iRight);

            //if (!(express is 变量 || express is 指针取值 || express is 数组元素))
            //    throw new InnerCException("\".\" 前面应该是 变量 或者 指针取值 表达式 。", chars, 左边的部分.iRight);

            if (!Util.Check_是否_下划线字母数字_且以_下划线字母_开头(chars, 右边的部分.iLeft, 右边的部分.iRight))
            {
                throw new InnerCException("无效的字段名 。", chars, 右边的部分.iLeft);
            }

            return(new 字段(express, new string(chars, 右边的部分.iLeft, 右边的部分.iRight - 右边的部分.iLeft + 1)));

            //变量 变量 = express as 变量;

            //if (变量 != null)
            //    return 字段(变量, null, new string(chars, 右边的部分.iLeft, 右边的部分.iRight - 右边的部分.iLeft + 1));

            //指针取值 指针取值 = express as 指针取值;

            //if (指针取值 != null)
            //    return 字段(null, 指针取值, new string(chars, 右边的部分.iLeft, 右边的部分.iRight - 右边的部分.iLeft + 1));

            //throw new InnerCException("\".\" 前面应该是 变量 或者 指针取值 表达式 。", chars, 左边的部分.iRight);
        }
        public static 表达式 Parse(char[] chars, int beginIndex, int endIndex)
        {
            StrSpan span = StrUtil.Trim(chars, beginIndex, endIndex, Parser._whiteSpaces);

            if (span.isEmpty)
            {
                throw new InnerCException("无效的表达式 。 缺少内容 。", chars, beginIndex);
            }


            List <表达式段> list = Parser._小括号中括号单引号双引号_分段(chars, span.iLeft, span.iRight);

            list = Parser.去掉空白段(chars, list);


            表达式 express = Parse_变量(chars, list);

            if (express != null)
            {
                return(express);
            }

            express = Parse_常量(chars, list);

            if (express != null)
            {
                return(express);
            }

            express = Parse_小括号表达式(chars, list);

            if (express != null)
            {
                return(express);
            }

            express = Parse_字段(chars, list);

            if (express != null)
            {
                return(express);
            }

            express = Parse_指针字段(chars, list);

            if (express != null)
            {
                return(express);
            }

            express = Parse_数组元素(chars, list);

            if (express != null)
            {
                return(express);
            }

            express = Parse_函数调用(chars, list);

            if (express != null)
            {
                return(express);
            }

            //express = Parse_函数指针调用(chars, list);

            //if (express != null)
            //    return express;

            throw new InnerCException("无效的表达式 。", chars, span.iLeft);
        }
コード例 #10
0
        public static 块作用域 Parse_块作用域(char[] chars, int beginIndex, int endIndex, ParseOptions option, out int j)
        {
            j = -1;

            块作用域 块 = new 块作用域();

            StrSpan span = StrUtil.Trim(chars, beginIndex, endIndex, Parser._whiteSpaces);

            if (span.isEmpty)
            {
                return(块);
            }

            //int j;

            //List<语句> list语句 = new List<语句>();


            for (int i = span.iLeft; ; i = j + 1)
            {
                span = StrUtil.Trim(chars, i, span.iRight, Parser._whiteSpaces);

                if (span.isEmpty)
                {
                    break;
                }
                //if (Check_变量类型_KeyWord(chars, i, 代码段.iRight, "int"))
                //{
                //    语句 = Parse_变量声明和赋值_语句(chars, i, 代码段.iRight, "int", out j, list变量声明);
                //}
                //else if (Check_变量类型_KeyWord(chars, i, 代码段.iRight, "float"))
                //{
                //    语句 = Parse_变量声明和赋值_语句(chars, i, 代码段.iRight, "float", out j, list变量声明);
                //}
                //else if (Check_变量类型_KeyWord(chars, i, 代码段.iRight, "double"))
                //{
                //    语句 = Parse_变量声明和赋值_语句(chars, i, 代码段.iRight, "double", out j, list变量声明);
                //}
                //else if (Check_变量类型_KeyWord(chars, i, 代码段.iRight, "char"))
                //{
                //    语句 = Parse_变量声明和赋值_语句(chars, i, 代码段.iRight, "char", out j, list变量声明);
                //}
                //if (Check_if_while_KeyWord(chars, i, 代码段.iRight, "if"))
                //{
                //    语句 = Parse_if_语句(chars, i, 代码段.iRight, out j, list变量声明);
                //}
                //else if (Check_if_while_KeyWord(chars, i, 代码段.iRight, "while"))
                //{
                //    语句 = Parse_while_语句(chars, i, 代码段.iRight, out j, list变量声明);
                //}
                //else if (Check_return_KeyWord(chars, i, 代码段.iRight))
                //{
                //    语句 = Parse_return_语句(chars, i, 代码段.iRight, out j, list变量声明);
                //}
                //else if (Check_变量声明(chars, i, 代码段.iRight, out 变量类型))
                //{
                //    语句 = Parse_变量声明和赋值_语句(chars, i, 代码段.iRight, 变量类型, out j, list变量声明);
                //}
                //else
                //{
                //    语句 = Parse_表达式_语句(chars, i, 代码段.iRight, out j, list变量声明);
                //}

                if_语句 if_语句 = if_语句_Parser.Parse(chars, span.iLeft, span.iRight, out j);

                if (if_语句 != null)
                {
                    if_语句.Set_作用域(块);

                    块.list语句.Add(if_语句);

                    continue;
                }

                while_语句 while_语句 = while_语句_Parser.Parse(chars, span.iLeft, span.iRight, out j);

                if (while_语句 != null)
                {
                    while_语句.Set_作用域(块);

                    块.list语句.Add(while_语句);

                    continue;
                }

                break_语句 break_语句 = Parse_break_语句(chars, span.iLeft, span.iRight, out j);

                if (break_语句 != null)
                {
                    break_语句.Set_作用域(块);

                    块.list语句.Add(break_语句);

                    continue;
                }

                return_语句 return_语句 = Parse_return_语句(chars, span.iLeft, span.iRight, out j);

                if (return_语句 != null)
                {
                    return_语句.Set_作用域(块);

                    块.list语句.Add(return_语句);

                    continue;
                }


                变量声明和初始化语句 变量声明语句 = Parse_变量声明和初始化_语句(chars, span.iLeft, span.iRight, out j);

                if (变量声明语句 != null)
                {
                    变量声明和初始化 变量声明 = 变量声明语句.变量声明;

                    if (块.dic变量声明.ContainsKey(变量声明.name))
                    {
                        throw new InnerCException("在当前作用域范围内已定义了名为 \"" + 变量声明.name + "\" 的变量 。", chars, 变量声明.变量位置_iLeft);
                    }

                    变量声明语句.Set_作用域(块);

                    块.dic变量声明.Add(变量声明.name, 变量声明);

                    块.list语句.Add(变量声明语句);

                    continue;
                }


                表达式语句 表达式语句 = Parse_表达式语句(chars, span.iLeft, span.iRight, out j);

                if (表达式语句 != null)
                {
                    表达式语句.Set_作用域(块);

                    块.list语句.Add(表达式语句);
                }



                if (option == ParseOptions.Parse_第一个语句)
                {
                    break;
                }
            }

            return(块);
        }
コード例 #11
0
        public static 变量声明和初始化 Parse_变量声明(char[] chars, int beginIndex, int endIndex)
        {
            StrSpan span = StrUtil.Trim(chars, beginIndex, endIndex, Parser._whiteSpaces);

            if (span.isEmpty)
            {
                return(null);
            }

            char c = chars[span.iLeft];

            if (!(c == '_' || StrUtil.IsLetter(c)))
            {
                return(null);
            }

            int 类型结束的位置的下一个字符位置 = Parser.向右寻找_不是_下划线字母数字_的字符(chars, span.iLeft + 1, span.iRight);

            if (类型结束的位置的下一个字符位置 == -1)
            {
                return(null);
            }

            c = chars[类型结束的位置的下一个字符位置];

            if (!(StrUtil.IsOneOf(c, Parser._whiteSpaces)) || c == '*')
            {
                return(null);
            }

            int 类型后不是空白和星号的位置 = StrUtil.FindForwardUntilNot(chars, 类型结束的位置的下一个字符位置, span.iRight, Parser._whiteSpaces和星号);

            if (类型后不是空白和星号的位置 == -1)
            {
                return(null);
            }

            c = chars[类型后不是空白和星号的位置];

            if (!(c == '_' || StrUtil.IsLetter(c)))
            {
                return(null);
            }

            int 星号Count = 0;

            for (int i = 类型结束的位置的下一个字符位置; i < 类型后不是空白和星号的位置; i++)
            {
                if (chars[i] == '*')
                {
                    星号Count++;
                }
            }

            表达式 表达式 = 表达式_Parser.Parse(chars, 类型后不是空白和星号的位置, span.iRight);

            int 类型字符串长度 = 类型结束的位置的下一个字符位置 - span.iLeft;

            变量声明和初始化 变量声明 = Parse_普通变量声明(chars, 表达式, span.iLeft, 类型字符串长度, 星号Count);

            if (变量声明 != null)
            {
                return(变量声明);
            }

            变量声明 = Parse_数组变量声明(chars, 表达式, span.iLeft, 类型字符串长度, 星号Count);

            if (变量声明 != null)
            {
                return(变量声明);
            }

            return(null);
        }