private void ParseFields(Message message, ProtoReader reader) { string data = reader.ReadLine(); if (data != "{") throw new Exception("message must start {"); while(true) { if (reader.EndOfStream) throw new Exception("not find }"); data = reader.ReadLine(); if (data == "}") break; Field field; switch(message.type) { case CmdType.ENUM: field = ParseEnumField(data, reader.Line); break; case CmdType.STRUCT: field = ParseStructField(data, reader.Line); break; default: throw new Exception("unknow msg type"); } message.fields.Add(field); } }
public void Parse() { ProtoReader reader = new ProtoReader(m_path); while(!reader.EndOfStream) { string cmd = reader.ReadLine(); if (cmd.Length == 0) continue; if(cmd.StartsWith("import ")) { int start = cmd.IndexOf('\"', 7); int end = cmd.LastIndexOf('\"'); if (start == -1 || end == -1) throw new Exception("bad import" + reader.Line + cmd); string file = cmd.Substring(start + 1, end - start - 1); if (!file.EndsWith(".proto")) throw new Exception(String.Format("import must end with .proto in line{0} of file{1}", reader.Line, m_path)); file = file.Remove(file.Length - 6); m_imports.Add(file); continue; } // 数据结构处理 string[] tokens = cmd.Split(new char[]{ ' '}, StringSplitOptions.RemoveEmptyEntries); CmdType type = CmdType.UNKNOWN; switch(tokens[0]) { case "enum":type = CmdType.ENUM;break; case "struct":type = CmdType.STRUCT;break; default: throw new Exception("unknow cmd line =" + reader.Line + ":cmd =" + cmd); } if (tokens.Length != 2 && tokens.Length != 4) throw new Exception("bad message" + reader.Line + cmd); Message message = new Message(); m_messages.Add(message); message.type = type; message.name = tokens[1]; if(tokens.Length == 4) { if(tokens[2] != "=") throw new Exception("bad message" + reader.Line + cmd); message.id_name = tokens[3]; } ParseFields(message, reader); message.process(); Process(); } }