/// <summary>
        /// 执行文法解释
        /// </summary>
        /// <param name="context"><see cref="TableDescContext"/>实例</param>
        public override void Interpret(TableDescContext context)
        {
            if (context == null || string.IsNullOrWhiteSpace(context.TableHtml))
            {
                return;
            }

            //数据表描述 的匹配正则式
            Regex regex = new Regex(@"<(?<HxTag>h\d+)\s+[^>]*id=""表[^>]+>\s*\[表\]\s*(?<desc>[^\((]+)[\((](?<name>[^\))]+)[\))]</\k<HxTag>>", RegexOptions.IgnoreCase | RegexOptions.Compiled);

            Match match = regex.Match(context.TableHtml);

            string name       = match.Groups["name"].Value;
            int    splitIndex = name.IndexOf("_");
            string module     = splitIndex > 0 ? name.Substring(0, splitIndex) : name;

            if (string.IsNullOrWhiteSpace(name))
            {
                name = ConfigurationManager.AppSettings["DefaultModuleName"];
            }

            context.Table.Name        = name.Replace("_", "");              //数据表名
            context.Table.Description = match.Groups["desc"].Value;         //数据表说明
            context.Table.Module      = module;                             //所属模块
        }
        /// <summary>
        /// 从Html代码中解析出数据表集合
        /// </summary>
        /// <param name="html"></param>
        /// <returns></returns>
        public static List <TableDesc> ResolveTables(string html)
        {
            if (string.IsNullOrWhiteSpace(html))
            {
                return(null);
            }

            List <TableDesc> list = new List <TableDesc>();

            #region //获取数据表的匹配集合

            Regex regex = new Regex(@"<(?<HxTag>h\d+)\s+[^>]*id=""表[^>]+>((?<Nested><\k<HxTag>[^>]*>)|</\k<HxTag>>(?<-Nested>)|.*?)*</\k<HxTag>>(?<clumns>((?!</table>).|\n)*)", RegexOptions.IgnoreCase | RegexOptions.Compiled);

            var tableMatchs = regex.Matches(html);

            #endregion

            #region //将每个HTML的内容描述转换为TableDesc对象

            //循环处理
            foreach (Match m in tableMatchs)
            {
                //定义数据表描述对象处理上下文
                TableDescContext context = new TableDescContext(m.Value);

                //将HTMl信息解释为数据表TableDesc的解释器
                List <TableExpression> exps = new List <TableExpression>();
                exps.Add(new TableDescExpression());    //数据表描述信息解释器
                exps.Add(new TableColumnsExpression()); //数据表字段解释器

                //循环执行文法解释器
                foreach (var exp in exps)
                {
                    exp.Interpret(context);
                }

                //将解释出来的TableDesc加入到集合中
                list.Add(context.Table);
            }

            #endregion

            return(list);
        }
        /// <summary>
        /// 执行方法解释
        /// </summary>
        /// <param name="context"><see cref="TableDescContext"/>实例</param>
        public override void Interpret(TableDescContext context)
        {
            if (context == null || string.IsNullOrWhiteSpace(context.TableHtml))
            {
                return;
            }

            //数据表字段 的匹配正则式
            Regex regex = new Regex(@"<tr>[\r\n\s]*<td>(?<cannullable><strong>)?(?<name>[^<]*)(</strong>)?</td>[\r\n\s]*<td>(?<datatype>[^<]*)</td>[\r\n\s]*<td>(?<defaultvalue>[^<]*)</td>[\r\n\s]*<td>(?<desc>((?!</td>).|\n)*)</td>[\r\n\s]*</tr>", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled);

            MatchCollection mc = regex.Matches(context.TableHtml);

            List <TableColumn> columnList = new List <TableColumn>();

            List <string> keys = new List <string>();

            //遍历字段处理
            foreach (Match m in mc)
            {
                //字段名
                string name = m.Groups["name"].Value.Trim();
                //字段描述
                string desc = ResolverDesc(m.Groups["desc"].Value.Trim());
                //是否可为空
                bool canNullable = string.IsNullOrWhiteSpace(m.Groups["cannullable"].Value);

                //字段枚举类型
                string enumType = ResolverEnumType(desc); //枚举类型

                //数据库数据类型
                string dbType;
                //C#中数据类型
                string csharpType;
                //总限制长度
                int totalBit;
                //小数位限制长度
                int decimalBit;

                //解析数据类型
                ResolverDataType(m.Groups["datatype"].Value, canNullable, out csharpType, out dbType, out totalBit, out decimalBit);
                if (!string.IsNullOrWhiteSpace(enumType))
                {
                    csharpType = enumType;
                }

                TableColumn column = new TableColumn();

                column.Name            = name;
                column.DefaultValue    = m.Groups["defaultvalue"].Value;
                column.Description     = desc;
                column.CanNullable     = canNullable;
                column.DataType        = csharpType;
                column.DbType          = dbType;
                column.TotalBit        = totalBit;
                column.DeicmalBit      = decimalBit;
                column.IsPrimaryKey    = desc.StartsWith("主键");
                column.IsUniquePrimary = false; //是否为唯一主键,默认false

                columnList.Add(column);

                //加入到主键集合中
                if (column.IsPrimaryKey)
                {
                    keys.Add(name);
                }
            }

            //处理唯一主键
            if (keys.Count == 1)
            {
                var item = columnList.FirstOrDefault(p => p.Name.Equals(keys[0]));
                item.IsUniquePrimary = true;
            }

            context.Table.Columns = columnList;
        }