示例#1
0
文件: Proto.cs 项目: jeckbjy/proto
        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);
            }
        }
示例#2
0
文件: Proto.cs 项目: jeckbjy/proto
 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();
     }
 }