Beispiel #1
0
        /// <summary>
        /// Creates a new instance of the Class class using the specified class stream as the source.
        /// </summary>
        /// <param name="name">the name of the class definition</param>
        public Class(Stream source, string name)
        {
            this.name = name;
            BinaryReader reader = new BinaryReader(source);

            header = Reinterpret.Memory <ClassHeader>(reader.ReadBytes(Marshal.SizeOf(typeof(ClassHeader))));

            if (header.Signature != Signature)
            {
                throw new InvalidDataException("Class source stream magic identifier did not match.");
            }

            for (int i = 0; i < header.ElementCount; i++)
            {
                elements.Add(new ElementWrapper(Reinterpret.Memory <Element>(reader.ReadBytes(Marshal.SizeOf(typeof(Element))))));
            }
        }
Beispiel #2
0
        //类全部注册完毕后,把类名补足,Identifier替换成Type
        public static void IdentifyType(string fileName, IList <Token> tokens)
        {
            DefineAttributes(tokens);

            List <string> usingNamespace = null;

            for (int i = 0; i < tokens.Count; i++)
            {
                if (tokens[i].type == TokenType.NAMESPACE)
                {
                    if (usingNamespace == null)
                    {
                        usingNamespace = new List <string>();
                    }

                    //C#中命名空间如果using System.Collections.Generic。也会同时using了System,System.Collections
                    ClassHeader header = new ClassHeader(tokens[i].text);
                    for (int j = 0; j < header.split.Length; j++)
                    {
                        if (!usingNamespace.Contains(header.split[j]))
                        {
                            usingNamespace.Add(header.split[j]);
                        }
                    }
                }
            }
            string[] usingNamespaceArray = usingNamespace != null?usingNamespace.ToArray() : null;

            Stack <ClassHeader> classHeaders = null;

            //目前处理方法是找Identifier是否是注册过
            //注意,可能造成错误 eg:
            //GameObject Debug;
            //Debug.Translate();//这里的Debug实际是变量,但是会被当做类来看待,暂时没想到好的解决方法
            //所以类命名尽量大写,变量命名尽量小写
            int begin = 0;

            for (; begin < tokens.Count; begin++)
            {
                if (tokens[begin].type == TokenType.IDENTIFIER)
                {
                    if (begin > 0)
                    {
                        if (tokens[begin - 1].type == TokenType.TYPE)
                        {
                            continue;                             //Type Type后面的一定是变量
                        }
                        if (tokens[begin - 1].text == ".")
                        {
                            continue;                            //X.b b一定是变量或方法
                        }
                    }
                    //找到连着的A.B.C
                    int end = begin;
                    while (end < tokens.Count - 2)
                    {
                        if (tokens[end + 1].text == "." && tokens[end + 2].type == TokenType.IDENTIFIER)
                        {
                            end += 2;
                        }
                        else
                        {
                            break;
                        }
                    }
                    //从后往前,直到是类就设置为Type
                    while (end >= begin)
                    {
                        string name = "";
                        for (int i = begin; i <= end; i++)
                        {
                            name += tokens[i].text;
                        }

                        string fullName = "";
                        //先判断外层类.比如类是Namespace.A.B.C 那么C类里的类应该先判断Namespace.A.B+X, Namespace.A.+X, Namespace.+X, X
                        if (classHeaders != null && classHeaders.Count > 0 && IsType(name, classHeaders.Peek().split, out fullName))
                        {
                            CombineReplace(tokens, begin, end - begin + 1, TokenType.TYPE, fullName);
                            break;
                        }

                        //在判断name是否是类
                        if (AppDomain.ContainsType(name))
                        {
                            CombineReplace(tokens, begin, end - begin + 1, TokenType.TYPE);
                            break;
                        }
                        //最后加命名空间判断Namespace1.X,Namespace2.X
                        if (usingNamespace != null && IsType(name, usingNamespaceArray, out fullName))
                        {
                            CombineReplace(tokens, begin, end - begin + 1, TokenType.TYPE, fullName);
                            break;
                        }

                        end -= 2;
                    }
                }
                if (tokens[begin].type == TokenType.CLASS)
                {
                    if (classHeaders == null)
                    {
                        classHeaders = new Stack <ClassHeader>();
                    }
                    classHeaders.Push(new ClassHeader(tokens[begin].text));
                }
                if (tokens[begin].type == TokenType.PUNCTUATION)
                {
                    if (classHeaders == null || classHeaders.Count == 0)                   //对paragraph来说,这里是空
                    {
                        continue;
                    }
                    if (tokens[begin].text == "{")
                    {
                        classHeaders.Peek().depth++;
                    }
                    else if (tokens[begin].text == "}")
                    {
                        classHeaders.Peek().depth--;
                        if (classHeaders.Peek().depth <= 0)
                        {
                            classHeaders.Pop();
                        }
                    }
                }
            }

            //如果有基类的话,指定基类
            DefineBaseTypes(tokens);

            //Identifier<Type ?? >合并成Identifier
            //Type<??>合并成Type
            CombineTempletType(tokens);

            //为了后面解析表达式方便,把一些类型做调整
            for (int i = 0; i < tokens.Count; i++)
            {
                Token tok = tokens[i];
                if (tok.type == TokenType.NAMESPACE)
                {
                    tok.type  = TokenType.IDENTIFIER;
                    tokens[i] = tok;
                }
                else if (tok.type == TokenType.CLASS)
                {
                    tok.type  = TokenType.TYPE;
                    tokens[i] = tok;
                }
                else if (tok.type == TokenType.KEYWORD && tok.text == "void")
                {
                    tok.type  = TokenType.TYPE;
                    tokens[i] = tok;
                }
            }
        }