static void ParseEnum(TokenReader tr, ProtoMessage parent, string package) { ProtoEnum me = new ProtoEnum(parent, package); LocalParser.ParseComments(me, lastComment, tr); me.ProtoName = tr.ReadNext(); parent.Enums.Add(me.ProtoName, me); //must be after .ProtoName is read if (tr.ReadNext() != "{") throw new ProtoFormatException("Expected: {", tr); while (true) { string name = tr.ReadNext(); if (ParseComment(name)) continue; if (name == "}") return; //Ignore options if (name == "option") { ParseOption(tr, null); lastComment.Clear(); continue; } ParseEnumValue(tr, me, name); } }
static void ParseMessage(TokenReader tr, ProtoMessage parent, string package) { var msg = new ProtoMessage(parent, package); LocalParser.ParseComments(msg, lastComment, tr); msg.ProtoName = tr.ReadNext(); tr.ReadNextOrThrow("{"); try { while (ParseField (tr, msg)) continue; } catch (Exception e) { throw new ProtoFormatException(e.Message, e, tr); } parent.Messages.Add(msg.ProtoName, msg); }
static void ParseExtend(TokenReader tr, ProtoMessage parent, string package, IEnumerable <string> imports) { var msg = new ProtoMessage(parent, package, imports); LocalParser.ParseComments(msg, lastComment, tr); msg.ProtoName = tr.ReadNext(); tr.ReadNextOrThrow("{"); try { while (ParseField(tr, msg, imports)) { continue; } } catch (Exception e) { throw new ProtoFormatException(e.Message, e, tr); } //Not implemented //parent.Messages.Add(msg.ProtoName, msg); }
static bool ParseField(TokenReader tr, ProtoMessage m) { string rule = tr.ReadNextComment(); while (ParseComment(rule)) { rule = tr.ReadNextComment(); } Field f = new Field(tr); //Rule switch (rule) { case ";": lastComment.Clear(); return(true); case "}": lastComment.Clear(); return(false); case "required": f.Rule = FieldRule.Required; break; case "optional": f.Rule = FieldRule.Optional; break; case "repeated": f.Rule = FieldRule.Repeated; break; case "option": //Save options ParseOption(tr, m); return(true); case "message": ParseMessage(tr, m, m.Package + "." + m.ProtoName); return(true); case "enum": ParseEnum(tr, m, m.Package + "." + m.ProtoName); return(true); case "extensions": ParseExtensions(tr); return(true); default: throw new ProtoFormatException("unknown rule: " + rule, tr); } //Field comments LocalParser.ParseComments(f, lastComment, tr); //Type f.ProtoTypeName = tr.ReadNext(); //Name f.ProtoName = tr.ReadNext(); //ID tr.ReadNextOrThrow("="); f.ID = ParseInt(tr); if (19000 <= f.ID && f.ID <= 19999) { throw new ProtoFormatException("Can't use reserved field ID 19000-19999", tr); } if (f.ID > (1 << 29) - 1) { throw new ProtoFormatException("Maximum field id is 2^29 - 1", tr); } //Add Field to message m.Fields.Add(f.ID, f); //Determine if extra options string extra = tr.ReadNext(); if (extra == ";") { return(true); } //Field options if (extra != "[") { throw new ProtoFormatException("Expected: [ got " + extra, tr); } ParseFieldOptions(tr, f); return(true); }