/// <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)))))); } }
//类全部注册完毕后,把类名补足,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; } } }