Пример #1
0
 public void EnterMethod(Metadata.DB_Member member)
 {
     currentMethod = member;
     EnterBlock();
     foreach (var arg in member.method_args)
     {
         AddLocal(arg.name, GetType(arg.type));
     }
 }
Пример #2
0
        void ConvertMemberCpp(Metadata.DB_Member member)
        {
            Metadata.DB_Type member_type = Model.GetType(member.typeName);
            if (member.member_type == (int)Metadata.MemberTypes.Field)
            {
                if (member.is_static)
                {
                    if (member_type.is_class)
                    {
                        AppendLine("Ref<" + GetCppTypeName(Model.GetType(member.type)) + "> " + GetCppTypeName(Model.GetType(member.declaring_type)) + "::" + member.name + ";");
                    }
                    else if (member_type.is_value_type)
                    {
                        Append(GetCppTypeName(Model.GetType(member.type)) + " " + GetCppTypeName(Model.GetType(member.declaring_type)) + "::" + member.name);
                        if (member.field_initializer != null)
                        {
                            sb.Append("=");
                            sb.Append(ExpressionToString(member.field_initializer));
                        }
                        sb.AppendLine(";");
                    }
                }
            }
            else if (member.member_type == (int)Metadata.MemberTypes.Method)
            {
                Model.EnterMethod(member);
                Metadata.DB_Type declare_type = Model.GetType(member.declaring_type);
                if (!declare_type.is_generic_type_definition && member.method_body != null)
                {
                    if (member.member_type == (int)Metadata.MemberTypes.Method)
                    {
                        sb.Append(string.Format("{0} {1}::{2}", member.type.IsVoid ? "void" : GetCppTypeWrapName(Model.GetType(member.type)), GetCppTypeName(Model.GetType(member.declaring_type)), member.name));
                    }
                    else
                    {
                        sb.Append(string.Format("{1}::{2}", "", GetCppTypeName(Model.GetType(member.declaring_type)), member.name));
                    }
                    sb.Append("(");
                    if (member.method_args != null)
                    {
                        for (int i = 0; i < member.method_args.Length; i++)
                        {
                            sb.Append(string.Format("{0} {1} {2}", GetCppTypeWrapName(Model.GetType(member.method_args[i].type)), member.method_args[i].is_ref ? "&" : "", member.method_args[i].name));
                            if (i < member.method_args.Length - 1)
                            {
                                sb.Append(",");
                            }
                        }
                    }
                    sb.AppendLine(")");

                    ConvertStatement(member.method_body);
                }
                Model.LeaveMethod();
            }
        }
Пример #3
0
 public void LeaveMethod()
 {
     LeaveBlock();
     currentMethod = null;
 }
Пример #4
0
        public DB_Type GetExpType(Expression.Exp exp, Expression.Exp outer = null)
        {
            if (exp is Metadata.Expression.ConstExp)
            {
                Metadata.Expression.ConstExp e = exp as Metadata.Expression.ConstExp;

                int int_v;
                if (int.TryParse(e.value, out int_v))
                {
                    return(GetType("System.Int32"));
                }

                long long_v;
                if (long.TryParse(e.value, out long_v))
                {
                    return(GetType("System.Int64"));
                }

                bool b_v;
                if (bool.TryParse(e.value, out b_v))
                {
                    return(GetType("System.Boolean"));
                }

                float single_v;
                if (float.TryParse(e.value, out single_v))
                {
                    return(GetType("System.Single"));
                }

                double double_v;
                if (double.TryParse(e.value, out double_v))
                {
                    return(GetType("System.Double"));
                }

                if (e.value == "null")
                {
                    return(GetType("System.Object"));
                }

                if (e.value.StartsWith("'"))
                {
                    return(GetType("System.Char"));
                }

                return(GetType("System.String"));
            }

            else if (exp is Metadata.Expression.FieldExp)
            {
                Metadata.Expression.FieldExp e           = exp as Metadata.Expression.FieldExp;
                Metadata.DB_Type             caller_type = GetExpType(e.Caller);

                if (outer is MethodExp)
                {
                    MethodExp methodExp = outer as MethodExp;
                    List <Metadata.DB_Type> argTypes = new List <Metadata.DB_Type>();
                    foreach (var t in methodExp.Args)
                    {
                        argTypes.Add(GetExpType(t));
                    }
                    Metadata.DB_Member member = caller_type.FindMethod(e.Name, argTypes, this);
                    return(GetType(member.typeName));
                }
                else
                {
                    DB_Member field = caller_type.FindField(e.Name, this);
                    if (field == null)
                    {
                        field = caller_type.FindProperty(e.Name, this);
                    }

                    if (field == null)
                    {
                        return(null);
                    }
                    return(GetType(field.typeName));
                }
            }

            else if (exp is Metadata.Expression.IndifierExp)
            {
                Metadata.Expression.IndifierExp e = exp as Metadata.Expression.IndifierExp;
                IndifierInfo info = GetIndifierInfo(e.Name);
                //if(outer is MethodExp)
                //{
                //    MethodExp methodExp = outer as MethodExp;
                //    List<Metadata.DB_Type> argTypes = new List<Metadata.DB_Type>();
                //    foreach (var t in methodExp.Args)
                //    {
                //        argTypes.Add(GetExpType(t));
                //    }
                //    foreach(var m in info.methods)
                //    {
                //        if(m.MatchingParameter(argTypes,this))
                //        {
                //            return GetType(m.typeName);
                //        }
                //    }

                //}
                //else
                {
                    return(info.type);
                }
            }

            else if (exp is Metadata.Expression.MethodExp)
            {
                Metadata.Expression.MethodExp me = exp as Metadata.Expression.MethodExp;

                List <Metadata.DB_Type> argTypes = new List <Metadata.DB_Type>();
                foreach (var t in me.Args)
                {
                    argTypes.Add(GetExpType(t));
                }

                if (me.Caller is FieldExp)
                {
                    FieldExp         fe          = me.Caller as FieldExp;
                    Metadata.DB_Type caller_type = GetExpType(fe.Caller, fe);
                    return(GetType(caller_type.FindMethod(fe.Name, argTypes, this).typeName));
                }
                else if (me.Caller is IndifierExp)
                {
                    IndifierExp  ie   = me.Caller as IndifierExp;
                    IndifierInfo info = GetIndifierInfo(ie.Name);

                    if (info.is_method)
                    {
                        foreach (var m in info.methods)
                        {
                            if (m.MatchingParameter(argTypes, this))
                            {
                                return(GetType(m.typeName));
                            }
                        }
                    }
                    else
                    {
                        return(info.type);
                    }
                }
            }

            else if (exp is Metadata.Expression.ObjectCreateExp)
            {
                Metadata.Expression.ObjectCreateExp e = exp as Metadata.Expression.ObjectCreateExp;
                return(GetType(e.Type));
            }

            else if (exp is Metadata.Expression.BaseExp)
            {
                return(GetType(currentType.base_type));
            }

            else if (exp is Metadata.Expression.ThisExp)
            {
                return(currentType);
            }

            else if (exp is Metadata.Expression.BinaryExpressionSyntax)
            {
                Metadata.Expression.BinaryExpressionSyntax me = exp as Metadata.Expression.BinaryExpressionSyntax;
                Metadata.DB_Type        caller_type           = GetExpType(me.Left);
                List <Metadata.DB_Type> argTypes = new List <Metadata.DB_Type>();
                argTypes.Add(GetExpType(me.Right));

                Metadata.DB_Member member = caller_type.FindMethod(me.OperatorToken, argTypes, this);
                return(GetType(member.typeName));
            }

            else if (exp is Metadata.Expression.PostfixUnaryExpressionSyntax)
            {
                Metadata.Expression.PostfixUnaryExpressionSyntax me = exp as Metadata.Expression.PostfixUnaryExpressionSyntax;
                Metadata.DB_Type        caller_type = GetExpType(me.Operand);
                List <Metadata.DB_Type> argTypes    = new List <Metadata.DB_Type>();
                argTypes.Add(caller_type);

                Metadata.DB_Member member = caller_type.FindMethod(me.OperatorToken, argTypes, this);
                return(GetType(member.typeName));
            }

            else if (exp is Metadata.Expression.PrefixUnaryExpressionSyntax)
            {
                Metadata.Expression.PrefixUnaryExpressionSyntax me = exp as Metadata.Expression.PrefixUnaryExpressionSyntax;
                Metadata.DB_Type        caller_type = GetExpType(me.Operand);
                List <Metadata.DB_Type> argTypes    = new List <Metadata.DB_Type>();
                argTypes.Add(caller_type);

                Metadata.DB_Member member = caller_type.FindMethod(me.OperatorToken, argTypes, this);
                return(GetType(member.typeName));
            }

            else if (exp is Metadata.Expression.ParenthesizedExpressionSyntax)
            {
                Metadata.Expression.ParenthesizedExpressionSyntax pes = exp as Metadata.Expression.ParenthesizedExpressionSyntax;
                return(GetExpType(pes.exp));
            }
            else if (exp is Metadata.Expression.ElementAccessExp)
            {
                Metadata.Expression.ElementAccessExp eae = exp as Metadata.Expression.ElementAccessExp;
                Metadata.DB_Type        caller_type      = GetExpType(eae.exp);
                List <Metadata.DB_Type> argTypes         = new List <Metadata.DB_Type>();
                foreach (var a in eae.args)
                {
                    argTypes.Add(GetExpType(a));
                }


                return(GetType(caller_type.FindProperty("Index", this).type));

                //string methodName = "";

                //if(outer is Metadata.Expression.AssignmentExpressionSyntax && ((Metadata.Expression.AssignmentExpressionSyntax)outer).Left == exp)
                //{
                //    methodName = "set_Index";
                //}
                //else
                //{
                //    methodName = "get_Index";
                //}

                //Metadata.DB_Member member = caller_type.FindMethod(methodName, argTypes, this);
                //return GetType(member.typeName);
            }
            else
            {
                Console.Error.WriteLine("无法确定表达式类型 " + exp.GetType().Name);
            }
            return(null);
        }
Пример #5
0
        void ConvertMemberHeader(Metadata.DB_Member member)
        {
            Metadata.DB_Type member_type = Model.GetType(member.typeName);
            if (member.member_type == (int)Metadata.MemberTypes.Field)
            {
                AppendLine(GetModifierString(member.modifier) + ":");
                //属性
                AppendLine(ConvertCppAttribute(member.attributes));
                if (member.is_static)
                {
                    Append("static ");
                }
                else
                {
                    Append("");
                }


                if (member_type.is_class)
                {
                    AppendLine(string.Format("{0}* {1};", GetCppTypeWrapName(Model.GetType(member.type)), member.name));
                }
                else
                {
                    AppendLine(string.Format("{0} {1};", GetCppTypeWrapName(Model.GetType(member.type)), member.name));
                }
            }
            else if (member.member_type == (int)Metadata.MemberTypes.Method)
            {
                Model.EnterMethod(member);

                AppendLine(GetModifierString(member.modifier) + ":");


                //属性
                AppendLine(ConvertCppAttribute(member.attributes));

                if (member.is_static)
                {
                    Append("static ");
                }
                else
                {
                    Append("");
                }

                if (member.method_abstract)
                {
                    sb.Append("abstract ");
                }
                if (member.method_virtual)
                {
                    sb.Append("virtual ");
                }

                if (member.member_type == (int)Metadata.MemberTypes.Method)
                {
                    sb.Append(string.Format("{1} {2}", "", member.type.IsVoid ? "void" : GetCppTypeWrapName(Model.GetType(member.type)), member.name));
                }
                else
                {
                    sb.Append(string.Format("{0}", member.name));
                }
                sb.Append("(");
                if (member.method_args != null)
                {
                    for (int i = 0; i < member.method_args.Length; i++)
                    {
                        sb.Append(string.Format("{0} {1} {2}", GetCppTypeWrapName(Model.GetType(member.method_args[i].type)), member.method_args[i].is_ref ? "&" : "", member.method_args[i].name));
                        if (i < member.method_args.Length - 1)
                        {
                            sb.Append(",");
                        }
                    }
                }

                Metadata.DB_Type declare_type = Model.GetType(member.declaring_type);

                if (declare_type.is_generic_type_definition)
                {
                    sb.AppendLine(")");
                    ConvertStatement(member.method_body);
                }
                else
                {
                    sb.AppendLine(");");
                }

                Model.LeaveMethod();
            }
        }