public override ABnfGuess Clone()
        {
            var guess = new ALittleScriptGuessNamespaceName(namespace_name, namespace_name_dec);

            guess.UpdateValue();
            return(guess);
        }
        public override ABnfGuessError GuessTypes(out List <ABnfGuess> guess_list)
        {
            guess_list = new List <ABnfGuess>();
            // 标记是否已经包含了命名域,命名域的guess不要重复
            bool has_namespace = false;

            var result_list = CalcResolve();

            foreach (var result in result_list)
            {
                ABnfGuess guess = null;
                if (result is ALittleScriptNamespaceNameDecElement)
                {
                    if (!has_namespace)
                    {
                        var error = result.GuessType(out ABnfGuess result_guess);
                        if (error != null)
                        {
                            return(error);
                        }
                        has_namespace = true;
                        var guess_namespace_name = new ALittleScriptGuessNamespaceName(
                            result_guess.GetValue(),
                            (ALittleScriptNamespaceNameDecElement)result
                            );
                        guess_namespace_name.UpdateValue();
                        guess = guess_namespace_name;
                    }
                }
                else if (result is ALittleScriptClassNameDecElement)
                {
                    var error = result.GuessType(out ABnfGuess class_guess);
                    if (error != null)
                    {
                        return(error);
                    }
                    if (!(class_guess is ALittleScriptGuessClass))
                    {
                        return(new ABnfGuessError(m_element, "ALittleClassNameDec.guessType()的结果不是ALittleScriptGuessClass"));
                    }

                    var class_guess_class = class_guess as ALittleScriptGuessClass;
                    if (class_guess_class.template_list.Count > 0)
                    {
                        return(new ABnfGuessError(m_element, "模板类" + class_guess_class.GetValue() + "不能直接使用"));
                    }

                    var guess_class_name = new ALittleScriptGuessClassName(class_guess_class.namespace_name,
                                                                           class_guess_class.class_name, result as ALittleScriptClassNameDecElement);
                    guess_class_name.UpdateValue();
                    guess = guess_class_name;
                }
                else if (result is ALittleScriptStructNameDecElement)
                {
                    var error = result.GuessType(out ABnfGuess struct_guess);
                    if (error != null)
                    {
                        return(error);
                    }
                    if (!(struct_guess is ALittleScriptGuessStruct))
                    {
                        return(new ABnfGuessError(m_element, "ALittleStructNameDec.guessType()的结果不是ALittleScriptGuessStruct"));
                    }
                    var struct_guess_struct = struct_guess as ALittleScriptGuessStruct;

                    var guess_struct_name = new ALittleScriptGuessStructName(struct_guess_struct.namespace_name,
                                                                             struct_guess_struct.struct_name, result as ALittleScriptStructNameDecElement);
                    guess_struct_name.UpdateValue();
                    guess = guess_struct_name;
                }
                else if (result is ALittleScriptEnumNameDecElement)
                {
                    var error = result.GuessType(out ABnfGuess enum_guess);
                    if (error != null)
                    {
                        return(error);
                    }
                    if (!(enum_guess is ALittleScriptGuessEnum))
                    {
                        return(new ABnfGuessError(m_element, "ALittleEnumNameDec.guessType()的结果不是ALittleScriptGuessEnum"));
                    }
                    var enum_guess_enum = enum_guess as ALittleScriptGuessEnum;

                    var guess_enum_name = new ALittleScriptGuessEnumName(enum_guess_enum.namespace_name,
                                                                         enum_guess_enum.enum_name, result as ALittleScriptEnumNameDecElement);
                    guess_enum_name.UpdateValue();
                    guess = guess_enum_name;
                }
                else if (result is ALittleScriptMethodParamNameDecElement)
                {
                    var error = result.GuessType(out guess);
                    if (error != null)
                    {
                        return(error);
                    }
                }
                else if (result is ALittleScriptVarAssignNameDecElement)
                {
                    var error = result.GuessType(out guess);
                    if (error != null)
                    {
                        return(error);
                    }
                }
                else if (result is ALittleScriptMethodNameDecElement)
                {
                    var error = result.GuessType(out guess);
                    if (error != null)
                    {
                        return(error);
                    }
                }
                else if (result is ALittleScriptUsingNameDecElement)
                {
                    var error = result.GuessType(out guess);
                    if (error != null)
                    {
                        return(error);
                    }
                }

                if (guess != null)
                {
                    guess_list.Add(guess);
                }
            }

            return(null);
        }